非常大的堆大小,但小的使用内存

时间:2012-09-21 13:36:51

标签: java memory garbage-collection heap

我在我的应用程序中看到非常大的堆大小,但是使用的内存非常小:

堆大小: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 ????

有什么问题

5 个答案:

答案 0 :(得分:5)

您的参数的初始堆大小

-Xms8448m

超过8GB。

-Xmx12544m

赋予JVM权限,允许它增长到超过12GB,并且它可能会这样做,如果内存可用并且感觉这是最好的堆大小,它永远不会释放它。规范中没有任何内容表明JVM应该尽量保持堆大小。

答案 1 :(得分:2)

HotSpot JVM中的堆大小永远不会下降。虽然一些GC算法可以将内存返回给操作系统。但是在以后的情况下,JConsole不会显示内存减少(在JConsole中,您看到为堆保留的地址空间范围),您应该使用OS进程内存监视来查看JVM实际释放内存。

可以将未使用的内存返回给OS的算法是

  • 串行收集器(-XX:+ UseSerialGC)
  • G1(-XX:+ UseG1GC)

答案 2 :(得分:0)

删除上面的-Xms8448m。它指定了初始堆大小。如果你删除它,它应该按预期工作。

答案 3 :(得分:0)

您使用-Xms8448m指定初始堆大小为~8.5GB。 java的某些实现不支持实际缩小堆(通常由于系统限制)。为较小的初始堆减少此值。

答案 4 :(得分:0)

JVM在启动时保留最大堆大小作为虚拟内存。这个内存中有多少是主内存取决于使用了多少。

当您设置最小内存时,它不保证它已被使用,但它只是极少尝试限制内存使用到目前为止。

  

但为什么堆大小几乎达到12 GB?

这就是你设定的目标。