根据我的理解,
次要GC
年轻时发生的GC通常被称为Minor,因为它需要少时间才能完成,因为live-set通常很小(我说的是考虑到弱点的典型java应用程序)世代假设)和一个复制收集器,具有较少数量的对象来重新定位和重新映射。
主要GC
在旧版本中出现的GC通常称为主要GC,因为它需要更多时间来完成,因为实时设置将大部分(与年轻人相比)并且它通常压缩旧的gen和压实时间随着老一代的大小而线性增加。
不幸的是,GC日志将旧一代集合报告为Full GC,而它只收集了正在收集的旧一代。但是在java内存管理白皮书中,有一个Full 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,并且当旧的Gen填满时总是有一个主要GC,那么这个所谓的Full GC何时会发生?如果年轻人和老一代收藏家都在尽自己的一份力量,那么堆如何变得充实呢?
感谢您的时间:)
答案 0 :(得分:4)
收集年轻一代和老一代的完整GC会在区域大小发生变化时发生。
例如,如果我们提到
-Xms1024m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=1024m
JVM最初以1GB的堆开始,但保留了2GB的空间。因此,随着这些区域的使用增加,基于VM的人体工程学,年轻和老一代的大小调整,直到它们达到2GB的最大保留大小。
同样适用于PermSize,每次PermGen调整大小时,都会发生完整的GC。
答案 1 :(得分:0)
Full GC - 我们已经知道,它收集了 Young Gen Space 和 Old Gen Space
什么时候触发?
我会解释两种情况
1.更快的对象分配/提升到老年代
假设 CMS 在旧的 gen 空间中运行。同时,由于在年轻代空间中运行的 MINOR GC 比 CMS 运行的速度快得多,因此越来越多的对象被提升到老年代空间。所以,
<块引用>GC 算法预测并发收集不会在堆满之前结束,因此它决定停止一切并运行 FULL GC。
2.促销失败
什么是促销失败? - 这与将对象从堆中的年轻代空间提升到老年代空间时失败有关。
假设 MINOR GC 在年轻代空间中运行并尝试将 对象 提升到老代空间,如果老代没有足够的连续空间来容纳对象,则会导致提升失败.
<块引用>升级失败将要求运行 FULL GC。它不要求 CMS GC,因为发生促销失败的主要原因是碎片。由于 CMS 无法解决碎片问题,FULL GC 是首选。
如果假设 CMS 在升级失败期间在旧代空间中运行,则会导致并发模式失败,当然也会运行 FULL GC。