p134 垃圾回收相关章节的说明
p135 什么是GC 为什么需要GC
P136 了解早起垃圾回收行为
p137 java自动内存管理介绍
p138垃圾回收相关算法概述
p139引用计数算法的原理及优缺点
p140 python引用计数实施方案
p141 可达性分析算法与GC ROOTS
p142 对象的finalization机制
p143 代码演示可复活的对象
public class CanReliveObj {
// 类变量,属于GC Roots的一部分
public static CanReliveObj canReliveObj;
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("调用当前类重写的finalize()方法");
canReliveObj = this;
}
public static void main(String[] args) throws InterruptedException {
canReliveObj = new CanReliveObj();
canReliveObj = null;
System.gc();
System.out.println("-----------------第一次gc操作------------");
// 因为Finalizer线程的优先级比较低,暂停2秒,以等待它
Thread.sleep(2000);
if (canReliveObj == null) {
System.out.println("obj is dead");
} else {
System.out.println("obj is still alive");
}
System.out.println("-----------------第二次gc操作------------");
canReliveObj = null;
System.gc();
// 下面代码和上面代码是一样的,但是 canReliveObj却自救失败了
Thread.sleep(2000);
if (canReliveObj == null) {
System.out.println("obj is dead");
} else {
System.out.println("obj is still alive");
}
}
}
p144使用MAT查看GC ROOTS
p145使用JProfile进行GC Roots溯源
import java.util.ArrayList;
public class TestHeap {
public static void main(String[] args) throws InterruptedException {
ArrayList<Object> list = new ArrayList<>();
while (true){
byte[] bytes = new byte[102400];
Thread.sleep(10);
list.add(bytes);
}
}
}