JVM是否在达到-Xmx限制时强制进行垃圾回收?

时间:2012-02-21 09:31:11

标签: java memory-management garbage-collection

问题基本上包含在标题中。

假设您的应用程序已达到其JVM -Xmx限制。当该应用程序需要更多内存时,是否强制进行垃(在HotSpot JVM中)

我无法解释的第二个奇怪的事情是我目前有一个运行-Xmx = 2048m的应用服务器,“top”命令(在Linux上)为其进程报告2.7g。

那么应用程序如何/何时允许超过其-Xmx?

谢谢,

7 个答案:

答案 0 :(得分:11)

实际上,当年轻代已满(不是整个堆)时会触发普通GC,并且当幸存者空间中没有剩余空间时会触发主要GC,因此需要将某些对象迁移到旧代。

答案 1 :(得分:7)

Xmx参数仅指定堆的大小。 Java进程占用更多内存,因为堆只是Java进程的一部分,我想你还有其他java进程包含的内容,如本机库,perm gen以及应用程序生成的本机内存分配。

这是一篇描述内存分配的好文章: http://www.ibm.com/developerworks/java/library/j-nativememory-linux/

答案 2 :(得分:4)

是的,如果它达到堆限制(并且可能更早),JVM肯定会调用GC。如果这没有帮助,它将抛出OutOfMemoryError s。

您看到更大的进程内存消耗的原因是-Xmx选项仅限制Java堆空间(分配Java对象的位置)。此外,JVM还使用了其他几个内存区域:Thread堆栈的空间,“PermGen”(存储类及其代码的位置),通过ByteBuffers分配的“直接”内存,本机库分配的内存,对于其中一些额外的内存区域,存在其他允许限制它们的配置选项,例如-Xss,但有些甚至无法控制JVM。

答案 3 :(得分:3)

通常就是这种情况,但通常会更快地触发GC,具体取决于您使用的垃圾收集器。

答案 4 :(得分:1)

是的,如果您仍然没有找到内存,则会引发OutOfmemory Error。我理解这样。

答案 5 :(得分:1)

IIRC保证在抛出OutOfMemoryError之前将执行完整的GC。由于超出堆大小限制必须导致这样的错误,这意味着当达到限制时,您将始终至少有一个完整的GC运行。

答案 6 :(得分:0)

垃圾收集是一个相当大的领域,但你说的对于完整的集合是正确的(还有其他类型)

需要注意的一点是-Xmx设置了最大堆大小,但也有一个-Xms,即最小堆大小。您的应用程序可能仅以最低配置开始。然后,如果使用的内存达到该值,它将触发完整的垃圾收集并增加可用堆的数量,从最小值(-Xmx)到某个值小于或等于最大值(-Xmx)。这可能会发生几次,直到达到最大值。之后,它不再增加堆,但是当达到最大值时,垃圾收集将继续发生。