一、判断哪些对象已死
1.引用计数算法(引用计数器)
2.可达性分析算法
GC Root是否可达(引用链)
不可达不一定判定为死亡,至少被标记两次。
最后被判断为有必要执行finalize()的对象放到F-Queue队列里,其中会进行第二次小规模的标记,是其中的对象最后拯 救自己的机会。
二、垃圾收集算法
1.标记清除法
标记和清除的效率不高
会产生内存碎片
2、复制算法
将内存缩小为原来的一般,内存代价高。
在新生代,常常将内存按8:1的比例分为Eden,和survivor
3.标记-整理算法
4.分代收集算法
针对不同的存活周期的对象,分为新生代和老年代,而执行不同的算法
三、HotSpot的算法实现
1.枚举根节点
从GC Root节点找引用链,会有GC停顿
在类加载完的时候就会把类中对象的信息储存在OopMap中
每到达一个安全点就会更新一次OopMap
安全区域为了解决线程子啊sleep或者Block状态时的GC进入问题
四、垃圾收集器:
1.Serial收集器
最基本的收集器。
单线程
stop the word
2 ParNew
serial收集器的的多线程版本
运行在Server模式
单CPU不如Serial
3 Parallel Scavenge
新生代收集器
使用复制算法
吞吐量优先的收集器
4 Serial Old
Serial收集器的老版本
使用标记整理算法
5 Parllel Old收集器
Parallel Scavenge的老版本
多线程
6 CMS 收集器
以最短停顿时间目标
标记清除算法
4个步骤:
初始标记:stop the word 只是标记GC Root能直接关联的对象
并发标记:执行GC Root Tracing
重新标记: 修正并发标记之间的改动
并发清除:并发标记和并发清除占时最长 ,但是可以与用户线程一起工作
优点:并发手机,低停顿
7 G1收集器
最前沿的成果
并行并发
分代收集
空间整合(整体为标记整理算法,局部为复制算法)
可预测的停顿
4个步骤:
初始标记
并发标记
最终标记
筛选回收
五、jvm中的新生代Eden和survivor区
HotSpot JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to)。默认比例为8:1,为啥默认会是这个比例,接下来我们会聊到。一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中。
六、大对象直接进入老年代
七、长期存活的对象进入老年代
有一个Age计数器,每经历一次Minor GC就会增加1
Eden区满时就会执行一次Minor GC