3个问题:
1.如何判断对象为垃圾对象
a.引用计数法
在对象中添加一个引用计数器,当有地方引用这个对象的时候,引用计数器的值就+1,
当引用失败(例如,对象置为null),引用计数器的值就-1
b.可达性算法(推荐)
从GCroot根节点往下搜索,能走到就不是垃圾对象,走不到就是对象
2.如何回收
a.回收策略
标记-清除算法
把判定为垃圾对象做一个标记,进行清除
但是,有两个问题
1.效率问题
2.空间问题
复制算法
主要解决了效率问题(新生代)
在Eden创建对象(80%)——垃圾的回收最喜欢的地方
Survivor(存活期)(20%)——垃圾回收后对象存活的地方
Tenured Gen
标记-整理算法(老年代)
先进行标记,把需要回收的和不需要的进行整理移动,中间分隔,把垃圾对象进行回收
分代收集算法
新生代——复制算法
老年代——标记-整理算法
b.垃圾回收器
serial
最基本,发展最悠久
单线程
桌面应用
parnew
复制算法
多线程
parallel
复制算法
多线程
达到可控制的吞吐量
吞吐量:(执行用户代码的时间)/(执行用户代码时间+垃圾回收所占用的时间)
-xx:MaxGCPauseMillis 垃圾收集器停顿时间
-xx:GCTimeRatio 吞吐量大小
cms
(不能与parllel一起使用)
老年代
标记-清除算法
并发:两件事同时做
并行:一件事几个人同时做
初始标记
并发标记
重新标记
并发清理
优点:并发收集、低停顿
缺点:占用大量的cpu资源,无法处理浮动垃圾、出现Concurrent mode Failure 、空间碎片
G1
优势:
并行与并发
分代收集(分区域)
空间整合
可预测的停顿
步骤:
初始标记
并发标记
最终标记
筛选回收
3.何时回收