【问题标题】:When will JVM trigger major garbage collection?JVM 什么时候会触发重大垃圾回收?
【发布时间】:2016-10-14 02:04:31
【问题描述】:

我正在尝试了解垃圾收集的工作原理。我清楚以下几点:

  1. JVM 分配对象失败时会触发 Minor GC 年轻一代。
  2. 列表项

JVM会触发full GC(minor+major GC) 堆已满。

但是,年轻代和年老代中不再被引用的对象,有资格进行GC,但没有触发GC(即年轻/老年代堆空间未满,因此不会发生GC)

这是否意味着这些对象将保留在年轻/老年代堆空间中,直到发生 GC?

我的阅读材料

【问题讨论】:

标签: java memory-management garbage-collection jvm


【解决方案1】:

它仍然保留在老年代,并且整体堆使用量增加,直到出现完整/主要 GC。 ops 团队正在监控堆的使用情况,他们担心堆的增长。

如果您的目标是监控活动对象的数量,例如要检测泄漏,那么您应该在主要 GC 之后立即测量堆占用率,而不是在它们之间。

例如,可以从 GC 日志文件中提取信息。

当堆满时JVM会触发full GC(minor+major GC)。

情况不一定如此。何时触发收集的决定基于将各种目标(例如暂停时间和吞吐量考虑在内)的启发式方法。

【讨论】:

  • 是的,老年代的堆空间在一天天的增加,但还没有引发major GC。
  • 我可以通过 WebLogic 触发主 GC 并在手动主 GC 之前/之后进行堆转储吗?使用 jmat 转储时是否应该包含 live 参数?即 jmat -dump:live format=b,file=
  • 在这种情况下,我是否应该担心老年代堆的增长?我担心发生内存泄漏。
  • 如果您看到零次主要 GC,那么这并不意味着您有泄漏,这意味着您允许 JVM 使用比它需要的更多的内存,它会决定使用它来避免支付 GC 的费用。
  • 这种情况下,是继续执行堆转储还是老年代空间算法去 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC 缓解运维团队对JVM去的后顾之忧内存不足?
【解决方案2】:

是的,如果没有 GC,那么对象将存在于堆中。

实际上,如果 GC 对象在年轻代中,它将存在于堆中,直到它被覆盖,如果是旧的,它取决于算法 - 但这仅从安全角度来看是有趣的。

【讨论】:

  • 由于大部分对象都是短命的,并且存在于年轻代堆空间中,所以会频繁发生Minor GC,但是对于老年代堆空间,它不会开始堆积,直到它完全填满并触发自己的主要/完整 GC?
猜你喜欢
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多