标签:stat protected main interrupt 系统调用 内存回收 崩溃 sys new
在进行可达性分析之后发现没有与GC Roots相连接的引用链
第一次标记后,筛选此对象是否有比要执行finalize()方法
没有必要执行finalize()方法的对象
对象没有覆盖finalize()方法
finalize()方法已经被虚拟机调用过
有必要的对象进入F-Queue队列中
由一条虚拟机自动建立的,低调度优先级的Finalizer线程去执行他们的finalize()方法
执行:触发执行,但不等待结束
如果某个对象的finalize()方法执行缓慢,甚至发生了死循环,将可能导致F-Queue队列中的其他对象永久处于等待,甚至导致整个内存回收子系统的崩溃
对F-Queue队列中的对象进行
还没有引用链,回收
public class TestGC { ? // 初始化对象为null public static TestGC SAVE_HOOK = null; ? public void isAlive(){ System.out.println("对象依然存活..."); } ? @Override protected void finalize() throws Throwable { super.finalize(); System.out.println("finalize方法执行了..."); // 把自己赋值给TestGC的SAVE_HOOK变量,引用链的建立 TestGC.SAVE_HOOK = this; } ? public static void main(final String[] args) throws InterruptedException { ? SAVE_HOOK = new TestGC(); ? // 对象第一次拯救自己 // 断掉引用 SAVE_HOOK = null; // 触发垃圾回收 System.gc(); // 因为Finalizer方法优先级很低,暂停等待 Thread.sleep(500); // 此时触发finalize方法,引用链再次存在,对象自救成功 if (SAVE_HOOK != null){ SAVE_HOOK.isAlive(); }else { System.out.println("对象已经死亡"); } ? SAVE_HOOK = null; System.gc(); Thread.sleep(500); // 一个对象的finalize方法最多只会被系统调用一次 if (SAVE_HOOK != null){ SAVE_HOOK.isAlive(); }else { System.out.println("对象已经死亡..."); } ? } }
标签:stat protected main interrupt 系统调用 内存回收 崩溃 sys new
原文地址:https://www.cnblogs.com/LittleSkinny/p/14419976.html