关于GC 中G1的一些整理

10 篇文章 0 订阅

G1 垃圾回收器

英文入门 oracle 官方指导
官方入门文档。

The Garbage First Garbage Collector (G1 GC) is the low-pause, server-style generational garbage collector for Java HotSpot VM. The G1 GC uses concurrent and parallel phases to achieve its target pause time and to maintain good throughput. When G1 GC determines that a garbage collection is necessary, it collects the regions with the least live data first (garbage first).

第一句话就简明的说明了G1 是干嘛的以及适用场景
大致意思就是 G1是针对hotspot 的一个运行再服务器端的分代垃圾回收器。它是并发和并行来运行确保低耗时和较高吞吐量。当要收集垃圾时候是从活动数据最少的区域(垃圾优先)开始的。

G1 中的几个基本概念

  • CSet 需要被回收的对象都放到这个cset中去
  • RSet 在每一个Region中都有一个set用于记录其他regoin中的对象对本region中的对象的引用

G1 他具有的特点

  • 内存区域不是固定的

G1 的理论上是分代模型,但是实际物理地址中不是分代的。再物理上G1将内存区域分为多个Region【1mb,2mb,最大32mb,这个是可以通过参数进行配置的】,每一块region都可以是新生代或者老年代,它不是固定的。每一个region分代都不是连续的,可能当前region是新生代,紧接着他的下一个region可能就是老年代,而再下一个可能又是新生代了。再G1中对于大对象是有多个连续的的region进行保存的,humongous这个中连续的region的名称,它可能占有了2个region或者3个region甚至更多,但是humongous的region都是连续的。

  • 并发标记,并发收集
  • 压缩空闲空间不会延长GC的暂停时间。
  • 更易预测GC的暂停时间
  • 适用于不需要非常高吞吐量的场景【比如需要很快的响应时间场景】

再次说下SATB

G1是用satb算法进行漏标垃圾回收的:
我们都是知道SATB 是在指向被删除或者消失后,不会真正的把引用删掉而是把引用push到了GC的堆栈中。再次扫描标记时拿到这个引用再重新扫描引用指向的白块;但是G1中有RSet的存在,只用在RSet中查找相应的引用,就可以不需要重新扫描所有引用指向的白块,这样就大大的提升了扫描效率,也就是SATB 配合RSet
简述一下流程:
1.当灰色A指向白色B的引用 a 被删除时会将a这个引用push到GC的堆栈中去
2.重标记阶段获取到堆栈中的a引用,通过a查看B所在的Region中的RSet看看是否有引用指向这个对象,要是没有引用指向这个对象,这时从GC堆栈中删除这个a引用并清理掉这个对象B。
所以G1的重标记阶段是很快就完成的,不用对所有堆扫描看是否还有引用指向B。通过RSet即可看到。
三色标记算法中说了一下SATB配合写屏障来使用的。并没有这么详细。但是三色标记是基础。

补充

要知道G1 的ygc 是针对理论年轻代执行的GC操作,但是老年代执行的GC操作叫mixed gc,而mixed gc的过程就是三色标记法实现的GC办法。
再G1的GC 日志中可以看到很多再执行YGC的同时伴随着各种mark操作,所以G1中YGC与mixed GC操作是同时混合执行的。

[GC pause (G1 Evacuation Pause) (young) (initial-mark), 0.0010 secs]

启动注意

  • 运行时增加 -XX:UseG1GC 参数。
  • 因为G1是动态调整Y空间与间隔YGC的时间所以不建议指定年轻代空间
  • 当GC 日志出现[FULL GC]时是一个很重要的需要关注的问题。需要查看回收日志,是否回收结果为0,是否存在内存泄漏等问题。

[Full GC (Allocation Failure) 18M->18M(20M), 0.0719656 secs]
[Eden: 0.0B(1024.0K)->0.0B(1024.0K) Survivors: 0.0B->0.0B Heap: 18.8M(20.0M)->18.8M(20.0M)], [Metaspace: 38
76K->3876K(1056768K)] [Times: user=0.07 sys=0.00, real=0.07 secs]

常用启动参数

  • XX:MaxGCPauseMillis
    建议值,G1会尝试调整Young区的块数来达到这个值
  • XX:GCPauseIntervalMillis
    GC的间隔时间
  • XX:+G1HeapRegionSize
    分区大小,建议逐渐增大该值,1 2 4 8 16 32。
    随着size增加,垃圾的存活时间更长,GC间隔更长,但每次GC的时间也会更长
    ZGC做了改进(动态区块大小)
  • G1NewSizePercent
    新生代最小比例,默认为5%
  • G1MaxNewSizePercent
    新生代最大比例,默认为60%
  • GCTimeRatio
    GC时间建议比例,G1会根据这个值调整堆空间
  • ConcGCThreads
    线程数量
  • InitiatingHeapOccupancyPercent
    启动G1的堆空间占用比例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值