1. 程式人生 > >JavaGC是什麼?在什麼時候?對什麼東西?做了什麼事情?

JavaGC是什麼?在什麼時候?對什麼東西?做了什麼事情?

1、JavaGC(java garbage collection)是什麼?

    GC:及垃圾回收機制,是java所特有的(與C/C++相比),對不使用的物件的銷燬,記憶體回收,又分為MinorGC與FullGC,且不需要專門編碼;

   工作機制:通過標記的方式,區別物件是否使用,若不使用則銷燬;

2、在什麼時候?

    java中的堆分為新生代、老年代、永久代(java中的類以及類載入器本身);

    新生代分為Eden與Survivor(s0,s1),首先,新建的物件都是在Eden區分配記憶體,當記憶體不夠的時候會產生MinorGC,將Eden區中存活的物件放入S0,並清空Eden區;若再一次發生MinorGC則將S0與Eden區中的存活的物件放入s1區,並且清空s0與Eden區;

    MinorGC執行的次數到達設定的閾值時(預設為15),會將物件放入老年代中;

    若老年代記憶體不足,則會發生FullGC;

    大物件以及長期存活的物件直接放入老年代;

3、對什麼物件?

    在GC執行前,需要先確定那些物件是存活的——可達性分析法;

    可達性分析法:通過一系列成為"GCRoot"的物件為起點,向下搜尋,搜尋的路徑稱為引用鏈;

    面向的物件:本地方法引用指向的物件、常量引用指向的物件、靜態變數引用指向的物件、Native方法的引用指向的物件;

    其中,GCRoot的物件沒有引用鏈,則被銷燬;

    詳情:如果GCRoot的物件沒有引用鏈則標記一次,銷燬物件,若重寫finalize方法,且為第一次呼叫,若沒有引用鏈則在標記一次;

    及物件在第一次標記後銷燬,且未復活的物件;

4、做什麼?

    新生代:複製清理;

        複製演算法:將記憶體分為倆個相等的部分,當A記憶體用完了,就把存活的物件放到B,並清空A,效率更高。原因是,每次只需要標記存活的物件,且無記憶體碎片,但是缺點確實,記憶體的使用率為一半;

    老年代:標記清理;

          標記清理:標記清除演算法、標記整理演算法;

          標記清除演算法,標記需要清除的物件,缺點,速度慢,效率低(標記和刪除都很費時間),會產生不連續的內尺碎片,且不利於大物件的分配;

          標記整理演算法:標記存活的物件,移動到一段,清理邊界以外的記憶體;

    ps:在老年代中,物件存活率較高,複製法效率太低;

         CMS(併發GC):使用的是標記清除演算法;