大家好,又见面了,我是你们的朋友全栈君。
G1这个名字是怎么来的
collect the regions with the least live data first(Garbage First).
G1适合什么情景
- 多核多CPU而且大内存
- 大内存
- 要求低停顿
G1如何实现-XX:MaxGCPauseMillis
所设置的目标?
首先这个目标是个软指标。
- 对于新生代来说,过G1自动调整新生代的大小。
- 对于老年代来说,每次Mixed Garbage Collecttion的时候回收的Rigion个数(基于Mixed Garbage Collection的目标次数,每个Region中的存活对象百分比,以及堆全局的垃圾比例)
G1如何实现避免碎片
无论是新生代还是老年代,使用复制算法。
将一批Region(被称作Collection Set,也就是CSet)复制到另外一批Region中来实现的。
如何避免可达性分析扫描整个堆?
名字叫做Remembered Sets(简称RSets) 每一个Region都有自己的RSets。用来记录对自己Region内对象的引用。
Collection Sets or CSets the set of regions that will be collected in a GC. All live data in a CSet is evacuated (copied/moved) during a GC. Sets of regions can be Eden, survivor, and/or old generation.
Remembered Sets or RSets track object references into a given region. There is one RSet per region in the heap. The RSet enables the parallel and independent collection of a region. The overall footprint impact of RSets is less than 5%.
在什么时机进行Mixed Garbage Collection
在堆的使用率达到-XX:InitiatingHeapOccupancyPercent
所设置的使用率时。
那这个使用率具体的计算其实并非是整个堆的内存使用率,而是老年代使用的内存/整个堆内存。
那做这个判断的时机是:每次Young GC结束的时候
为什么这么做,因为老年代空间中的使用内存发生变化只有一个情形:Young GC的时候。 所以在这个时候判断是最合理的。
其实是整个G1收集器总是在两种状态之间切换
- young-only
- space-reclaimation
那顾名思义,young-only就是只有新生代垃圾回收,有一部分垃圾就会不停地被送入老年代。 而space-reclaimation这个词是从老年代的角度来说的。就是开始重新回收老年代的垃圾。
那当young gc结束,发现堆内存已经达到了阈值的时候,就会开启一个既不是young gc也不是mixed gc的一个过程,叫global concurrent marking。
这个所谓global concurrent marking的第一步就是叫initial mark,这一步是STW的。 然而Young GC也是需要做跟initial mark基本相同的处理的,就是找GC Roots直接的引用。所以,这里就公用了。导致initial mark事实上是Young GC的一部分。
在global concurrent marking之后,如果判断需要进入space-reclaimation阶段,才会接下来进行mixed gc。
什么是global concurrent marking
是由young gc触发的一系列处理。 分为5个步骤。
-
initial mark(STW)
找到GC Roots直接引用的Region(限于Survivor区)。注意并不是对象 这其实是Young GC的一部分
-
root region scaning
扫描第一步中找到的Region(Survivor区中的),找到对老年代中对象的引用
-
concurrent mark
就是用可达性分析算法扫描所有Region
-
re-mark(STW)
标记那些在concurrent mark阶段发生变化的对象
-
clean up(Partly STW)
这最后一步最具有迷惑性。好像最后一步就进行垃圾回收一样。其实不是的。
- 标记死对象,标记哪些存活率最低的region,来让后面的mixed gc来回收
- 因为有了死对象,擦洗RSets
- 把空Region送回free list。
G1都有哪些STW处理
⭕️young gc
因为是复制算法 这个复制的过程是STW的。另外提一嘴,这个过程是多线程完成的。
⭕️mixed gc
因为也是采用复制算法。 需要注意的是,mixed gc也包括对新生代的收集。
⭕️global concurrent mark中的initial mark、remark、部分clean up
既然有CMS,为什么要选择G1
原因
- STW更加可控
- 由于采用了标记-整理算法,不会产生内存碎片
Humongous Objects的分配和回收
大于Region的空间的一半的算Humongous Objects。
Humongous Objects被分配在Humongous Region,直接在老年代。
这个回收不在mixed gc。
而是在global concurrent marking的最后一步:clean up中。
G1调优
-XX:MaxGCPauseMillis
最大STW时间。这个参数设置的逻辑是最大停顿时间和吞吐量的平衡 因为如果这个参数设置过小,那么GC就会频繁,吞吐量会降低。
-XX:InitiatingHeapOccupancyPercent & -XX:+G1UseAdaptiveIHOP
InitiatingHeapOccupancyPercent简称IHOP
-XX:+G1UseAdaptiveIHOP
是默认值,也就是说IHOP是adaptive的
-XX:InitiatingHeapOccupancyPercent
是初始值
Full GC的调优
Full GC的例子
-
跟CMS一样,浮动垃圾产生的溢出
增加堆大小 或者增加
-XX:ConcGCThreads
-
垃圾晋升失败
方法就是提升
-XX:G1ReservePercent
同时同比例地增加堆大小。 或者提前启动标记周期:减少-XX:InitiatingHeapOccupancyPercent
转载于:https://juejin.im/post/5bb838486fb9a05d11179865
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/144995.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...