我在我的应用程序中看到非常大的堆大小,但是使用的内存非常小:
堆大小:10 GB +, 已用内存:500 MB
这解释了什么?为什么堆大小不会减少。 Memory Graph http://i48.tinypic.com/b5423a.png
我的java内存参数如下:
-Xms8448m -Xmx12544m -XX:PermSize =192米 -XX:MaxPermSize参数=256米 -XX:+ UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction = 60
请指教,为什么这种奇怪的行为。我可以看到用过的内存在图中被垃圾收集了,但是Heap Memory ????
有什么问题答案 0 :(得分:5)
您的参数的初始堆大小
-Xms8448m
超过8GB。
-Xmx12544m
赋予JVM权限,允许它增长到超过12GB,并且它可能会这样做,如果内存可用并且感觉这是最好的堆大小,它永远不会释放它。规范中没有任何内容表明JVM应该尽量保持堆大小。
答案 1 :(得分:2)
HotSpot JVM中的堆大小永远不会下降。虽然一些GC算法可以将内存返回给操作系统。但是在以后的情况下,JConsole不会显示内存减少(在JConsole中,您看到为堆保留的地址空间范围),您应该使用OS进程内存监视来查看JVM实际释放内存。
可以将未使用的内存返回给OS的算法是
答案 2 :(得分:0)
删除上面的-Xms8448m。它指定了初始堆大小。如果你删除它,它应该按预期工作。
答案 3 :(得分:0)
您使用-Xms8448m
指定初始堆大小为~8.5GB。 java的某些实现不支持实际缩小堆(通常由于系统限制)。为较小的初始堆减少此值。
答案 4 :(得分:0)
JVM在启动时保留最大堆大小作为虚拟内存。这个内存中有多少是主内存取决于使用了多少。
当您设置最小内存时,它不保证它已被使用,但它只是极少尝试限制内存使用到目前为止。
但为什么堆大小几乎达到12 GB?
这就是你设定的目标。