垃圾回收机制
引用计数法 (循环引用会导致垃圾回收不到)
可达性分析法(Root Searching 根可达算法)
线程栈变量、静态变量、常量池、JNI指针 都是root 对象
垃圾回收算法
-
标记、清除(mark-sweep):
优点:存活效率比较高的时候,效率高
缺点:两遍扫描,效率低;容易产生碎片 -
复制(copying)
优点:适用于存活对象找少,只扫描一次,效率提高,没有碎片
缺点:空间浪费,移动复制对象,需要整理对象引用 -
标记、压缩(mark-compact)
优点:空间连续,无碎片
缺点:扫描两次,移动碎片,效率偏低
JMM
新生代:老年代 = 1:2
新生代 = Eden (8)+ s0(1)+s1(1)
垃圾回收机器
1.Serial :STW(stop the world) ,单线程回收.
Serial : 针对年轻代(copy 回收算法)
Serial Old : 针对老年代(标记清除、标记压缩)
2. Parallel Scavenge : STW ,多线程回收
Parallel S: 针对年轻代(copy)
Parallel Old: 针对老年代 (标记清除、标记压缩)
3.CMS: 开始并行回收垃圾,适用老年代
Par New (新生代) + CMS 一起使用
过程:
(1)初始化标记 : 使用STW,找到GC Root
(2)并行标记
(3)重新标记 : 使用STW,然后重新标记
(4)标记清除
优点: 并行回收
缺点:使用标记、清除算法,会导致碎片化(浮动垃圾),太多碎片化后,又才有Serial Old清除,FGC时间长
三色标记算法
黑色:自己标记完,属性也标记完
灰色:自己标记完,属性未标记完
白色:未标记
三色标记的缺点: 并发标记时,白色对象被错误回收
CMS算法 采用三色标记 + Incremental update(白色被黑色引用,就把黑色标记为灰色)
4. Par New: STW,多线程,但是可以和CMS一起使用
5. G1: 物理上不分新生代和老年代,只是在逻辑上采用新生代和老年代
G1算法: 三色标记+ SATB(snapshot at beginging)
6.ZGC :
算法: coloredPointer + 写屏障
7.Shenandoah
算法: coloredPointer + 读屏障
8.Eplison
参考资料:https://www.cnblogs.com/super-jing/p/10795099.html