标签:roots 赋值 pre 就会 强引用 main throwable final 退出
在前一篇大致讲解了JVM的内存结构,在对JVM有一定了解的基础上,接下来进行JVM垃圾收集的学习
内存的动态分配与内存回收技术已经很成熟了,了解GC和内存分配:一方面为了当出现内存溢出,内存泄漏的时候排查问题,另一方面垃圾收集会成为实现更高并发量的瓶颈,所以我们需要对这些“自动化”的技术实施必要的监控和调节。
/** * testGC 方法执行后,objA和objB会不会被GC回收呢? */ public class TestGC{ public Object instance = null; public static void testGC(){ TestGC objA = new TestGC(); TestGC objB = new TestGC(); objA.instance = objB; objB.instance = objA; //图一 objA = null; objB = null; //图二 } //图三 }
/** 下面的代码演示了两点: 1.对象可以在GC时自我拯救 2.这种自救的机会只有一次,因为一个对象的finalize方法最多只会被系统自动的执行一次 */ public class EscapeGC{ public static EscapeGC SAVE_HOOK = null; public void isAlive() { System.out.println("yes, i am still alive :)"); } @Override protected void finalize() throws Throwable{ super.finalize(); System.out.println("finalize method executed"); EscapeGC.SAVE_HOOK = this;//在这里吧自己赋值给了类变量,拯救了自己 } public static void main(String[] args) throws Throwable { SAVE_HOOK = new EscapeGC(); //对象第一次成功拯救自己 SAVE_HOOK = null; System.gc(); //因为Finalize方法优先级很低,暂停0.5秒,等待它 Thread.sleep(500); if(SAVE_HOOK != null){ SAVE_HOOK.isAlive(); }else{ System.out.println("no, i am dead :("); } //下面这段代码与上面的完全相同,但是这次自救却失败了 SAVE_HOOK = null; System.gc();//一个对象的finalize方法最多会执行一次 //因为Finalize方法优先级很低,暂停0.5秒,等待它 Thread.sleep(500); if(SAVE_HOOK != null){ SAVE_HOOK.isAlive(); }else{ System.out.println("no, i am dead :("); } } }
在介绍完根搜索算法后,堆中对象的死亡判断算法已经介绍完了。接下来介绍一下方法区中的垃圾回收。
待补充
标签:roots 赋值 pre 就会 强引用 main throwable final 退出
原文地址:http://www.cnblogs.com/hefeng-ebay/p/7705305.html