【问题标题】:Does the JVM force garbage collection when it reaches its -Xmx limit?JVM 在达到 -Xmx 限制时会强制进行垃圾收集吗?
【发布时间】:2012-03-11 14:49:22
【问题描述】:

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

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

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

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

谢谢,

【问题讨论】:

  • -Xmx=2048 是 2048 字节。我假设您的意思是-Xmx=2048m 注意:您可以只写-mx2g,这是一样的。
  • @PeterLawrey 谢谢,是的,我的意思是 2048m。编辑了问题。

标签: java memory-management garbage-collection


【解决方案1】:

其实正常GC是在年轻代满(不是整个堆)时触发的,而主GC是在幸存者空间没有剩余空间时触发的,所以需要将一些对象迁移到老年代。

【讨论】:

  • +1:通常一个完整的终身空间会触发一个完整的 GC。次要集合通常通过在此发生之前将对象移动到永久空间来避免填充幸存者空间。
  • -Xmx 只设置最大堆大小。这通常是最大的区域,但不是唯一的区域。您有线程堆栈、直接内存、共享库、JVM 本身等。
【解决方案2】:

Xmx 参数只指定堆的大小。 Java 进程占用更多内存,因为堆只是 Java 进程的一部分,我猜你还有其他 Java 进程包含的东西,比如本机库、perm gen 以及应用程序进行的本机内存分配。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        是的,如果您仍然找不到内存,则会引发 OutOfmemory 错误。我是这样理解的。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            垃圾回收面积挺大的,不过你说的全回收是对的(还有其他类型)

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

            【讨论】:

              猜你喜欢
              • 2012-12-06
              • 1970-01-01
              • 1970-01-01
              • 2017-05-07
              • 2010-09-16
              • 2015-02-12
              • 1970-01-01
              • 1970-01-01
              • 2013-09-20
              相关资源
              最近更新 更多