Java堆不断缩小!这个堆大小图中发生了什么?

chi*_*tom 4 java garbage-collection

这是运行ActiveMQ的JVM(win64,6u17)的屏幕截图,在堆大小减少的每次垃圾收集之后.随着堆大小的减少,垃圾收集变得更加频繁,并且堆减少得更快.最终,VM会锁定,因为它在GC中花费了所有时间.

-Xms是默认值,-Xmx是2048mb.

怎么了!!?我怎么能避免这个?

http://imagebin.org/92614

缩小堆http://imagebin.org/index.php?mode=image&id=92614

nb最初发布在serverfault.com上,按要求移至stackoverflow.com

Tho*_*mas 8

谷歌从IBM JVM常见问题解答中找到了以下内容(NLA的内容如何):

Java堆何时缩小?

当GC确定存在大量可用堆存储时,会发生堆收缩,释放一些堆内存有利于系统性能.在GC之后发生堆收缩,但是当所有螺纹仍然悬挂时.

Sun JVM做了类似的事情.以下是Oracle技术网在5.0 Java虚拟机中标题为人机工程学的文章的摘录.

堆将增大或缩小到支持所选吞吐量目标的大小.可以预期在初始化期间和应用程序行为发生变化期间堆大小的一些振荡.

...

当垃圾收集器试图满足竞争目标时,堆的大小通常会振荡.即使应用程序已达到稳定状态,也是如此.实现吞吐量目标(可能需要更大的堆)的压力与目标竞争最大暂停时间和最小占用空间(两者都可能需要小堆).

我建议你看一下该文件的其余部分; 它可能有更多与您的问题相关的信息.


mR_*_*r0g 6

有一个JVM参数控制何时调整堆的大小.

-XX:MaxHeapFreeRatio

默认值为70.自由比率是堆上未分配的总空间大小的空间量.它可用空间的百分比超过默认值70%,jvm将减小堆的大小以允许操作系统使用内存.

如果堆过于频繁地缩小,则可以增加-XX:MaxHeapFreeRatio的值.如果设置为100,则可能永远不会溢出.