G1垃圾两种回收模式
Mixed GC:会同时对年轻代和部分的老年代进行收集(年轻代包含(Eden和survivor))
全局并发标记(global concurrent marking)
类似阈值当global concurrent marking 超过了这个比例 下次GC就会发生Mixed GC 当全局并发标记完其实此时就知道old的区域的垃圾占比 超过改值就会发生Mixed GC,YaungGC和Mixed GC是交替进行的
也就是说当前老年代区域中的存活对象所占内存 小于这个值(垃圾多于存活对象),超过了就说明改区域对象引用多于设置值就不用回收
意思就是说最多能回收老年代的region的个数
这里就可以看出来 新生代占据堆内存的百分比
咱就把阶段2 3当做CMS中预处理和尝试失败的处理
G1的两种标记算法
1.三色标记算法
- 子对象可以理解为该对象内部的成员变量
- 只有白色对象才会被回收
上图中应该是子对象的成员变量扫描完所以变成黑色(这里无需等成员变量子对象完全扫描完才变黑色只要被扫描到说明该对象就全部扫描完) 而他的成员变量还没被扫描完所以是灰色
此时相对于根节点来说他的AB变量已经扫描完 相对B来说他的成员变量C还没被扫描
由于并发标记所以应用程序和并发标记同事进行当应用程序执行下述代码时
此时对象会变成如下情况:
此处由于B下述没有子对象了此时会变成黑色而B对象已经被标记成黑色不会再去扫描A了,此时C对象就不会被扫描到,而此时的C是白色G1就会误认为C没引用将其回收掉。
此时就出现‘’漏标‘’现象
SATB标记算法(解决三色标记漏标情况)
也就是说上述的流程当A去引用C时 由于B指向C 此时发生了变化 就把C给标记成非白的 可能存在浮动垃圾此时变化可能C没有任何对象指向 但是G1是允许存在这种情况
意思就是新生代不会和老年代一样采用回收效率最高的分区,而是直接回收年轻代所有的区
SATB两种情况
并发标记新生成对象如何处理?
并发标记阶段引用发生变化如何处理?
SATB只在初始标记时生成快照记录存活对象引用情况 但在并发标记时可能发生改变
意思就是说并发的时候灰色的对象的成员变量发生了变化,此时发生变化的原成员变量标记成灰色,黑色新引用的成员变量标记成黑色
**Cset记录所有回收垃圾的区域 无论是young GC还是Minxed GC都会标记全局的Eden region,意思就是说这两种GC都会造成所有Eden区域的回收 **
G1调优最佳实践