• G1垃圾回收器


    G1 同样存在着年代的概念,但其内部是类似棋盘状的一个个 region 组成。

    region 的大小是一致的,数值是在 1M 32M 字节之间的一个 2 的幂值数,JVM 会尽量划分 2048 个左右、同等大小的 region。当然这个数字既可以手动调整,G1 也会根据堆大小自动进行调整。在 G1 实现中,年代是个逻辑概念,具体体现在,一部分 region 是作为 Eden,一部分作为 Survivor,除了意料之中的 Old regionG1 会将超过 region 50% 大小的对象(在应用中,通常是 byte char 数组)归类为 Humongous 对象,并放置在相应的 region 中。逻辑上,Humongous region 算是老年代的一部分,缺点:region 大小和大对象很难保证一致,这会导致空间的浪费。 GC 算法的角度,G1 选择的是复合算法,可以简化理解为:

    在新生代,G1 采用的仍然是并行的复制算法,所以同样会发生 Stop-The-World 的暂停。

    在老年代,大部分情况下都是并发标记,而整理(Compact)则是和新生代 GC 时捎带进行,并且不是整体性的整理,而是增量进行的。习惯上人们喜欢把新生代 GCYoung GC)叫作 Minor GC,老年代 GC 叫作 Major GC,区别于整体性的 Full GC,但是现代 GC 中,这种概念已经不再准确,对于 G1 来说:Minor GC 仍然存在,虽然具体过程会有区别,会涉及 Remembered Set 等相关处理。老年代回收,则是依靠 Mixed GC。并发标记结束后,JVM 就有足够的信息进行垃圾收集,Mixed GC 不仅同时会清理 EdenSurvivor 区域,而且还会清理部分 Old 区域有一个重点就是 Remembered Set,用于记录和维护 region 之间对象的引用关系G1中提供了两种模式垃圾回收模式,Minor GCYoungGCMixed GC,两种都是Stop The World(STW)的。

    1.YoungGC年轻代收集

    在分配一般对象(非巨型对象)时,当所有eden region使用达到最大阀值并且无法申请足够内存时,会触发一次YoungGC。每次younggc会回收所有Eden以及Survivor的垃圾,并且将存活对象复制到Old区以及另一部分的Survivor区。

    2.mixed gc

    当越来越多的对象晋升到老年代old region时,为了避免堆内存被耗尽,虚拟机会触发一个混合的垃圾收集器,即mixed gc,该算法并不是一个old gc,除了回收整个young region,还会回收一部分的old region,这里需要注意:是一部分老年代,而不是全部老年代,可以选择哪些old region进行收集,从而可以对垃圾回收的耗时时间进行控制。

    G1没有fullGC概念,需要fullGC时,调用serialOldGC进行全堆扫描

    G1收集器的阶段分以下几个步骤:

    1、初始标记(它标记了从GC Root开始直接可达的对象)

    2、并发标记(从GC Roots开始对堆中对象进行可达性分析,找出可达对象)

    3、最终标记(标记那些在并发标记阶段发生变化的对象,将被回收)

    4、筛选回收(首先对各个Regin的回收价值和成本进行排序,根据用户所期待的GC停顿时间指定回收计划,回收一部分Region

    另,G1只有并发标记时是与用户线程并发执行的,cms是并发标记并且并发回收。

  • 相关阅读:
    PHP fread() 函数
    PHP fputs() 函数
    PHP fputcsv() 函数
    PHP fpassthru() 函数
    分区表基本类型
    C# const 和 readonly 有什么区别
    win2d 画出好看的图形
    win2d 画出好看的图形
    win2d 渐变颜色
    win2d 渐变颜色
  • 原文地址:https://www.cnblogs.com/wl889490/p/12891771.html
Copyright © 2020-2023  润新知