一、 垃圾回收
- 如何判定对象为垃圾回收?
1. 引用计数法 2. **可达性分析法**
- 如何回收?
1. 回收策略 1. 标记-清除算法 2. 复制算法 3. 标记-整理算法 4. 分代收集算法 2. 垃圾收集器 1. Serial 2. Parnew 3. CMS 4. **G1**
- 何时回收?
1. 引用计数法 在对象中添加一个引用计数器,引用这个对象的时候计数器+1,引用失效时计数器-1。 打印gc信息: 1. -verbose:gc 2. -xx:+PrintGCDetails 2. 可达性分析法 GCRoots的路径能否连接到下一级,不可以则将下一集标记为垃圾 作为GCRoots的对象 1. 虚拟机栈 2. 方法区的类属性所引用的对象 3. 方法区中常量所引用的对象 4. 本地方法栈中引用的对象
二、 回收算法
- 标记-清除算法
效率问题
空间问题:空间不连续 - 复制算法(分区移动):提高了标记-清除算法的性能
新生代Eden 伊甸园 Survivor 存活区 Tenured Gen
老年代 - 标记-整理算法
移动再清除 - 分代收集算法(复制算法(新生代)+标记-整理算法(老年代))
三、 垃圾回收器
Serial收集器
最基本、发展最悠久
单线程
桌面应用ParNew收集器
Parallel Scavenge收集器
复制算法(新生代收集器)
多线程收集器
达到可控制的吞吐量吞吐量:CPU用于运行用户代码的时间与CPU消耗的总时间的比值
吞吐量=(执行用户代码时间)/(执行用户代码时间+垃圾回收时间)
-XX:MaxGCPauseMills 垃圾收集器最大停顿时间
-XX:GCTimeRation 吞吐量大小CMS(Concurrent Mark Sweep)垃圾收集器
工作过程:初始标记 并发标记 重新标记 并发清理
优点:
并发收集 低停顿
缺点:
占用大量的CPU资源 无法处理浮动垃圾 Concurrent Mode Error 空间碎片
G1收集器
优势并行与并发 分代收集 空间整合 可预测的停顿
步骤
初始标记 并发标记 最终标记 筛选回收