JVM 什么时候会触发主要垃圾回收?

3
我正在尝试理解垃圾回收的工作原理。我已经清楚以下几点:
  1. JVM在无法将对象分配到年轻代时会触发Minor GC。
  2. 列表项

JVM在堆满时会触发Full GC(包括Minor GC和Major GC)。

但是,如果年轻代和老年代中的对象不再被引用,有资格进行GC,但没有触发GC(即年轻/老年代堆空间未满,因此不会发生GC),那么这意味着这些对象将一直留在年轻/老年代堆空间中,直到发生GC吗?

我的阅读材料


1
你在提到哪种垃圾回收算法?每个算法都有自己触发Major GC的阈值。https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/ - kosa
如果它是默认选项,那我们该怎么办呢?并行 GC? - ilovetolearn
这可能有所帮助:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html#parallel_collector_ergonomics - kosa
前面的链接介绍了分配是如何进行的,如果您正在寻找垃圾回收触发的时机,这个链接可能会有所帮助(仅适用于CMS收集器,其他收集器可能有自己的策略,您可以参考他们的文档)https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/cms.html#concurrent_mark_sweep_cms_collector - kosa
在JVM内存耗尽之前,总会进行一次完整的GC。关于另一个问题,可以参考HotSpot虚拟机垃圾回收调优指南,但如果您正在使用EOL Java 6,则需要重新检查每个选项的可用性... - Holger
显示剩余7条评论
2个回答

1
它仍然停留在旧一代,整体堆使用量增加,直到进行完整/主要GC。运维团队正在监控堆使用情况,他们对不断增长的堆感到担忧。
如果您的目标是监视活对象的数量,例如检测泄漏,则应立即在主要GC之后测量堆占用率,而不是在它们之间。
例如,可以从GC日志文件中提取信息。
JVM将在堆满时触发完整GC(包括次要+主要GC)并不一定如此。决策何时触发收集基于启发式算法,考虑各种目标,例如暂停时间和吞吐量。

是的,老年代堆空间正在逐日增加,但尚未引发主要GC。 - ilovetolearn
我可以通过WebLogic触发主GC并在手动主GC之前/之后进行堆转储吗?使用jmat进行转储时,我应该包括live参数吗?即 jmat -dump:live format=b,file=<filename>。 - ilovetolearn
在编程中,我是否应该担心一个不断增长的老一代堆?我担心的是内存泄漏的发生。 - ilovetolearn
如果您看不到任何主要 GC(Garbage Collection) ,那并不意味着您有泄漏,而是意味着您允许 JVM 使用比它所需更多的内存,并且它决定使用它以避免支付 GCs 的成本。 - the8472
你应该确定是否真的有问题。看起来你正在追逐幻影。 - the8472
显示剩余4条评论

1
如果没有垃圾回收,对象将存在于堆中。
实际上,即使在进行垃圾回收后,如果对象位于年轻代中,则对象仍将存在于堆中,直到被覆盖;对于老年代,这取决于算法 - 但这只是从安全性的角度来看有趣。

由于大多数对象的生命周期很短,它们都存在于年轻代堆空间中,因此会频繁发生Minor GC。但对于老年代堆空间,它不会开始积累直到完全填满并触发Major/Full GC。 - ilovetolearn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接