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):使用的是標記清除演算法;