根据我的理解:
小GC
在年轻一代中发生的GC通常被称为小GC,因为它需要较少的时间来完成,因为活动集通常很小(考虑到弱的世代假设,我指的是典型的java应用程序)和一个拷贝收集器,需要重新定位和重新映射的对象数量较少。
主GC
在旧代中出现的GC通常称为主GC,因为它需要更多的时间来完成,因为活动集大多是大的(与年轻的GC相比),它通常压缩旧的世代,压实的时间随着老一代的大小线性增加。
不幸的是,GC日志将旧代集合报告为完整的GC,而只收集旧代。但是在java内存管理白皮书中,有一个完整GC的概念,在这个概念中收集整个堆。
A Full GC will be triggered whenever the heap fills up. In such a case the
young generation is collected first followed by the old generation. If the
old generation is too full to accept the content of the young generation,
the young generation GC is omitted and the old generation GC is used to
collect the full heap, either in parallel or serial. Either way the whole
heap is collected with a stop-the-world event.如果当年轻一代填满时总是有一个小GC,而当旧世代填满时总是有一个主GC,那么什么时候才会出现所谓的完全GC?如果年轻的和年老的收集者都在做他们的工作,为什么堆会变满呢?
发布于 2015-03-11 10:47:32
当区域大小发生变化时,收集年轻一代和老年人的完整GC。
例如,如果我们提到
-Xms1024m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=1024m
JVM最初以1GB堆启动,但从OS中为2GB预留了空间。因此,随着这些区域的使用增加,基于VM人机工程学,年轻一代和老一代将被调整大小,直到达到最大预留大小2GB。
同样的情况也适用于PermSize,每次PermGen调整大小时,都会出现一个完整的GC。
发布于 2021-07-08 17:06:54
Full GC -我们已经知道,它同时收集了Young Gen Space和Old
是什么时候触发的?
我将解释两种情况
1.对老一代的更快的对象分配/升级率
假设CMS在旧的gen空间中运行。同时,由于小GC以比CMS运行更快的速度在年轻的gen空间中运行,越来越多的对象被提升到旧的gen空间。所以,
GC算法预测并发集合不会在堆满之前结束,因此它决定停止所有操作,运行满GC.。
2.促销失败
什么是促销失败?-这与在堆中将对象从年轻一代提升到老一代空间时发生的失败有关。
假设较小的GC在年轻的gen空间中运行,并试图将对象提升到旧的gen空间,如果旧的gen没有足够的连续空间来容纳对象,则会导致推广失败。
升级失败将需要运行完整的GC。它不需要CMS GC,因为推广失败发生的主要原因是碎片。由于CMS不会解决碎片化问题,所以完整的GC是选择。
如果假设CMS在升级失败期间运行在旧的gen空间中,则会导致并发模式失败,当然,完整的GC也会运行。
https://stackoverflow.com/questions/24766118
复制相似问题