jvm G1:混合气相色谱和全气相色谱有什么区别?

xwbd5t1u  于 2022-11-07  发布在  其他
关注(0)|答案(4)|浏览(171)

对于垃圾优先收集器,young gc表示仅在年轻代中执行gc,而mixed gc将同时清理年轻代和老代。
那么什么是全气相色谱?为什么它比混合气相色谱持续时间长?
我已经做了一些搜索,但我没有找到任何职位,解释完整的gc

v6ylcynt

v6ylcynt1#

来自Oracle G1 GC blogtechnetwork article

年轻GC:

  • Young GC* 的收集组仅包含年轻/残存区域。
    混合气相色谱法:
  • Mixed GC* 的收集组既包括年轻/幸存区域,也包括老区域。
  • 巨大的对象和巨大的分配 *
    对于G1 GC,任何大于区域大小一半的对象都被视为“巨大对象"。这样的对象在旧代中直接分配到“巨大区域”中。* 这些巨大区域是一组连续的区域。*
    ***Dead Humongous对象在标记周期结束时的清理阶段以及整个垃圾收集周期内***被释放。

为了减少复制开销,任何清空暂停都不包括Humongous对象。* 完整的垃圾收集周期会就地压缩Humongous对象。*
通常,Full GC会清理整个堆-包括年轻空间和终身空间(旧代)
另一方面,不管GC类型如何,您都必须考虑“应用程序线程被停止”的时间:年轻GC或完整GC等

yb3bgrhw

yb3bgrhw2#

g1将堆划分为多个区域,其中年轻代和老代各自包含几个区域。(不是全部),但是,所有这些区域都被分配给年轻代。(不是全部),一些属于年轻代,至少一个属于老代。完整的GC收集所有区域,因此,年轻一代和老一代。

0tdrvxhp

0tdrvxhp3#

在正常情况下,G1应该只运行新的和混合的收集,以满足其暂停时间目标。
完全GC是一种后备机制,可能会违反这些目标。当混合GC无法跟上分配时,当无法满足巨大的分配时,或者当GC请求具有System.gc()和一些其他条件时,就会发生完全GC。
使用-XX:+PrintGCDetails进行的日志记录应包括完全收集的原因。

ltskdhd1

ltskdhd14#

年轻GC和混合GC的区别在于:

  • Mixed GC包含旧区域回收(默认为旧区域的1/8)。
  • 当达到IHOP时,将触发混合GC。(默认情况下,当旧代〉45%时。)

来自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的原因是因为应用程序分配了太多无法足够快地回收的对象。通常并发标记无法及时完成以启动空间回收阶段。

相关问题