1.识别垃圾对象的方法
引用计数法:给对象加一个引用计数器,有一个地方引用就加1,引用失效就减1,计数器为0就是可回收对象。无法解决相互循环依赖的关系,因为相互引用时计数器永远不为0 。
可达性分析对象
GCROOTS从节点开始向下搜索引用的对象,找到的对象都标记为非垃圾对象,其余未标记的对象为垃圾对象。
根节点通常是线程的本地变量,静态变量,本地方法栈的变量等。
2.垃圾回收算法
标记清除法,复制法,标记整理法。
3.垃圾收集器
JDK1.8之前使用分代,JDK1.9之后使用分区。
分代:年轻代、老年代
年轻代占1/3,老年代占2/3
年轻代中包含8/10Eden(伊甸园区)->s0(1/10)->s1(1/10)(s0,s1幸存区)。
当年轻代的Eden区占满后执行引擎开启垃圾收集线程monitorGC,YGC, 移入s0年龄加1,s0满了移入s1年龄加1,s1满了移入s0,年龄加1。
GC会引发stw(stop the world)
年轻代都满了,会进入老年代,老年代满了会引发 full gc
年轻代使用的复制法,serial,parallel,parnew
老年代 serial old ,parallel old (标记整理法)
cms(concurrentmarksweep)使用的并行标记清除法。包括初始标记,并发标记,重新标记,标记清理。
网友评论