引用计数法(不推荐使用)
- 可回收对象
a、没有被引用的对象:A
b、没有互相应用的对象:BCD
- 缺陷
循环依赖对象不可回收:EF
ReferenceCountingGC objA = new ReferenceCountingGC();
ReferenceCountingGC objB = new ReferenceCountingGC();
objA.instance=objB;
objB.instance=objA;
objA=null;
objB=null;
根搜索算法(GCRoots,也叫可达性算法,不推荐直接使用)
- 可回收对象
灰色背景部分
- 可作为GCRoots的对象包括
(1). 虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。
(2). 方法区中的类静态属性引用的对象。
(3). 方法区中常量引用的对象。
(4). 本地方法栈中JNI(Native方法)引用的对象。
- 为什么jvm不直接使用gc root去回收整个堆呢
因为效率太低了,我们99.99%的对象基本存活不到3s
根搜索算法代码演示
1.测试代码
// 加入list中
ArrayList<Object> jaryes = new ArrayList<Object>();
jaryes.add("jarye");
jaryes.add("test");
System.out.println("存储成功..");
/***暂停打印堆信息1***/
System.in.read();
// 引用内存地址变为空
jaryes = null;
System.out.println("jaryes变为null");
/***暂停打印堆信息2***/
System.in.read();
System.in.read();
System.out.println("end");
2.堆信息导入到Eclipse Memory Analyzer工具
-
根节点信息
-
堆信息1
-
堆信息2
网友评论