对于垃圾优先收集器,young gc表示仅在年轻代中执行gc,而mixed gc将同时清理年轻代和老代。那么什么是全气相色谱?为什么它比混合气相色谱持续时间长?我已经做了一些搜索,但我没有找到任何职位,解释完整的gc。
v6ylcynt1#
来自Oracle G1 GC blog和technetwork article
年轻GC:
为了减少复制开销,任何清空暂停都不包括Humongous对象。* 完整的垃圾收集周期会就地压缩Humongous对象。*通常,Full GC会清理整个堆-包括年轻空间和终身空间(旧代)另一方面,不管GC类型如何,您都必须考虑“应用程序线程被停止”的时间:年轻GC或完整GC等
yb3bgrhw2#
g1将堆划分为多个区域,其中年轻代和老代各自包含几个区域。(不是全部),但是,所有这些区域都被分配给年轻代。(不是全部),一些属于年轻代,至少一个属于老代。完整的GC收集所有区域,因此,年轻一代和老一代。
0tdrvxhp3#
在正常情况下,G1应该只运行新的和混合的收集,以满足其暂停时间目标。完全GC是一种后备机制,可能会违反这些目标。当混合GC无法跟上分配时,当无法满足巨大的分配时,或者当GC请求具有System.gc()和一些其他条件时,就会发生完全GC。使用-XX:+PrintGCDetails进行的日志记录应包括完全收集的原因。
System.gc()
-XX:+PrintGCDetails
ltskdhd14#
年轻GC和混合GC的区别在于:
来自Oracle文档:https://docs.oracle.com/en/java/javase/11/gctuning/garbage-first-g1-garbage-collector1.html自适应IHOP尝试设置初始化堆占用,以便当旧代占用为当前最大旧代大小减去作为额外缓冲区的-XX:G1 HeapReservePercent值时,开始空间回收阶段的第一个混合垃圾收集。对于完全GC,在空间回收之后,收集周期以另一个仅年轻阶段重新开始。作为备份,如果应用程序在收集活动信息时耗尽内存,G1会像其他收集器一样执行就地停止整个堆压缩(Full GC)。发生Full GC的原因是因为应用程序分配了太多无法足够快地回收的对象。通常并发标记无法及时完成以启动空间回收阶段。
4条答案
按热度按时间v6ylcynt1#
来自Oracle G1 GC blog和technetwork article
年轻GC:
混合气相色谱法:
对于G1 GC,任何大于区域大小一半的对象都被视为“巨大对象"。这样的对象在旧代中直接分配到“巨大区域”中。* 这些巨大区域是一组连续的区域。*
***Dead Humongous对象在标记周期结束时的清理阶段以及整个垃圾收集周期内***被释放。
为了减少复制开销,任何清空暂停都不包括Humongous对象。* 完整的垃圾收集周期会就地压缩Humongous对象。*
通常,Full GC会清理整个堆-包括年轻空间和终身空间(旧代)
另一方面,不管GC类型如何,您都必须考虑“应用程序线程被停止”的时间:年轻GC或完整GC等
yb3bgrhw2#
g1将堆划分为多个区域,其中年轻代和老代各自包含几个区域。(不是全部),但是,所有这些区域都被分配给年轻代。(不是全部),一些属于年轻代,至少一个属于老代。完整的GC收集所有区域,因此,年轻一代和老一代。
0tdrvxhp3#
在正常情况下,G1应该只运行新的和混合的收集,以满足其暂停时间目标。
完全GC是一种后备机制,可能会违反这些目标。当混合GC无法跟上分配时,当无法满足巨大的分配时,或者当GC请求具有
System.gc()
和一些其他条件时,就会发生完全GC。使用
-XX:+PrintGCDetails
进行的日志记录应包括完全收集的原因。ltskdhd14#
年轻GC和混合GC的区别在于:
来自Oracle文档:https://docs.oracle.com/en/java/javase/11/gctuning/garbage-first-g1-garbage-collector1.html
自适应IHOP尝试设置初始化堆占用,以便当旧代占用为当前最大旧代大小减去作为额外缓冲区的-XX:G1 HeapReservePercent值时,开始空间回收阶段的第一个混合垃圾收集。
对于完全GC,
在空间回收之后,收集周期以另一个仅年轻阶段重新开始。作为备份,如果应用程序在收集活动信息时耗尽内存,G1会像其他收集器一样执行就地停止整个堆压缩(Full GC)。
发生Full GC的原因是因为应用程序分配了太多无法足够快地回收的对象。通常并发标记无法及时完成以启动空间回收阶段。