我有一个Java应用程序在运行,几个小时后就会占满内存。
我尝试使用VisualVM检测内存泄漏,但它显示错误的数据(不知道怎么会出现这种情况)。
在屏幕截图中,您可以看到任务管理器显示700Mb的内存使用情况,而VisualVM只显示225...
有人知道这里发生了什么吗?
谢谢!
我有一个Java应用程序在运行,几个小时后就会占满内存。
我尝试使用VisualVM检测内存泄漏,但它显示错误的数据(不知道怎么会出现这种情况)。
在屏幕截图中,您可以看到任务管理器显示700Mb的内存使用情况,而VisualVM只显示225...
有人知道这里发生了什么吗?
谢谢!
java -Xmx512m -Xms256m ...
当JVM启动时,它会立即占用256 MB的内存(操作系统会告诉你这个数字大概是多少)。然而,如果你打开内存监视工具(如visualvm、jconsole等),它可能会显示你使用的内存比这个要少(只是因为你还没有需要使用到整个堆内存的大小)。
然后还有另外两个重要的因素。堆大小仅为程序使用或可以使用的内存量。但是在程序和操作系统之间存在Java虚拟机,可能也会占用相当多的内存。任务管理器显示您的程序加上VM使用的内存量。
另一个因素是内存碎片。某些数据结构(例如数组)必须位于内存的连续块中。array [i + 1] 必须位于 array [i] 后面的内存插槽中。这意味着,如果您已经分配了10 MB内存,并且使用了中间2 MB内存,而您想创建一个6 MB的数组,则Java虚拟机必须分配新内存,以便将数组放入一个块中。 这会增加任务管理器中的内存使用量,但不会增加堆大小,因为堆大小仅显示实际使用的内存。