java - Full GC 什么时候触发?

标签 java memory-management garbage-collection

据我了解:

次要 GC

发生在年轻一代的 GC 通常称为次要,因为它需要更少的时间来完成,因为 live-set 通常很小(我说的是典型的 java 应用程序,考虑到弱世代假说)和一个复制收集器,需要重新定位和重新映射的对象数量较少。

主要 GC

发生在老一代的 GC 通常被称为 Major GC,因为它需要更多时间来完成,因为 live-set 大部分都很大(与年轻一代相比)并且它通常会压缩旧的gen 和 compaction 的时间随着老年代的大小线性增加。

不幸的是,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.

如果在年轻代填满时总是有一次 Minor GC,而在老年代填满时总是有一次 Major GC,那么所谓的 Full GC 何时会发生?如果年轻一代和老一代收集器都在尽自己的一份力量,为什么堆会变满?

最佳答案

当区域大小发生变化时,将收集年轻代和老年代的 Full GC。

例如,如果我们提到

-Xms1024m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=1024m

JVM 最初以 1GB 的堆启动,但从操作系统中保留了 2GB 的空间。因此,随着这些区域的使用量增加,根据 VM 人体工程学,新生代和老年代的大小将被调整,直到它们达到 2GB 的最大保留大小。

同样的事情也适用于 PermSize,每次 PermGen 调整大小时,都会发生完整的 GC。

关于java - Full GC 什么时候触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58678599/

相关文章:

java - 如何在Java apache中添加超链接的空间地址

java - 如何删除非数字?

c++ - 删除从函数返回的指针?

c# - 是否可以从 .net 线程触发并忘记长时间运行的 SQL 语句(在 SQL Server 2005+ 上)?

java - 如何返回 JTable 中的实际单元格组件边界?

java - 数组索引存储在新数组中

c++ - 检测到堆损坏 : after Normal block(#151) at 0x00DB4E70

c - 零大小的 memblocks 有什么用?

java - 存储在垃圾收集过程中的引用对象的 "age threshold"存储在哪里?

java - JDK 8 内存布局和垃圾回收