如何判断对象为垃圾对象?如何回收?何时回收?
1.引用计数法(没有使用)
在对象中添加一个引用计数器,当有地方引用时,引用计数器加一,当引用生效时,引用计数器减一
public class Test2 {
private Test2 t;
public Test2(){
byte[] bytes = new byte[20 * 1024 * 1024];
}
public static void main(String[] args) {
Test2 t1 = new Test2();
Test2 t2 = new Test2();
t1.t=t2;
t2.t=t1;
t1=null;
t2=null;
System.gc();
}
}
在vm options中添加参数
-verbose:gc
-XX:+PrintGCDetails
2.可达性分析法
作为GCRoot的对象
虚拟机栈
方法区的类属性所引用的对象
方法区常量所引用的对象
本地方法栈中所引用的对象
3.回收策略
a.标记-清除算法
效率问题
空间问题
b.复制算法
线程共享区:堆(新生代:Eden、Suvivor、 Tenured Gen;年老代) 方法区
线程独占区:栈 本地方法栈 程序计数器
针对新生代回收
c.标记-整理-清除算法
针对老年代回收
d.分代收集算法
不同的分代年龄的对象使用不同的回收算法
4.垃圾收集器
a.serial收集器
最基本最悠久,单线程垃圾收集器,没有线程开销
适合桌面应用
b.ParNew收集器
多线程
c.parallel收集器
复制算法(新生代收集器)
多线程收集器
吞吐量:CPU运行用户代码的时间与CPU消耗的总时间的比值
(吞吐量=运行用户代码的时间/(运行用户代码的时间+垃圾收集消耗的时间))
-XX:MaxGCPauseMillis 垃圾收集器的最大停顿时间
-XX:GCTimeRatio 吞吐量大小(0,99)
达到可控制的吞吐量
d.CMS(Concurrent Mark Sweep)垃圾收集器
工作过程:(老年代)
初始标记
并发标记
重新标记
并发清理
优点:
并发收集 低停顿
缺点:
占用大量CPU资源
无法处理浮动垃圾
出现Concurrent Mode Failure
空间碎片
e.g1垃圾收集器(最牛的垃圾收集器)
优势:
并行并发
分代收集(针对内存区域)
空间整合
可预测的停顿
步骤:
初始标记
并发标记
最终标记
筛选回收
176万+

被折叠的 条评论
为什么被折叠?



