Java GC 總結
阿新 • • 發佈:2018-07-31
概述 現在 垃圾回收算法 靜態 image 了解 GC垃圾收集器 java 收集
Java GC垃圾收集器
概述
關於JavaGC,有三件事情需要了解
1.那些內存需要回收
2.什麽時候回收
3.這麽回收
這麽判斷對象已死
引用計數法
用一個計數器表示對象的引用,對象被引用就+1,,引用失效-1.不過這個算法有一個問題,就是對象的相互引用,會使對象無法回收。比如A引用B,B引用A,這兩個對象實際上已經沒用了,但是無法回收。現在的虛擬機都不會通過該算法來判斷對象
可達性分析算法
這個算法通過一系列稱為"GC Roots"的對象作為起始點,當一個對象到GC Roots沒有任何引用鏈相連時,則證明該對象沒用了。 "GC Roots"包括: 1.虛擬機棧引用對象(局部變量表) 2.方法去靜態屬性引用對象 3方法去中常量引用的對象 4,本地方法棧中JNI引用對象 具體結構如下圖
垃圾回收算法
標記-清除算法
如同名字一樣,分為標記和清除兩步,這是最基本的收集算法,其他算法都是基於這個思路並且優化的。這算個標記和清除效率都不高,而且清除完後有很多不連續的內存碎片。
如圖
復制算法
就是將內存一分為二,將存活的對象復制到另一半,將原來的對象全部刪除。
這個算法很浪費內存,浪費了一半的內存。
現在商業的虛擬機新生代都是采用這個算法但並不是1:1的比例,實際比例8:1,會劃分為一個eden和兩個Survivor空間,將eden和其中一個Survivor中存活的復制到另一個Survivor中,空間不足時以來老年代進行分配擔保
如圖:
標記-整理算法
與清除一樣,只是不直接清除,是先將存活的對象向一端移動,然後清理掉邊界之外的內存
如圖
分代收集算法
將內存分為新生代、老年代和永生代三個區域,新生代因為每次會有大量對象死去,使用復制算法,老年代存活率高,沒有多余空間對它進行分配擔保,使用標記-清理或者標記-整理算法
Java GC 總結