1. 程式人生 > >Java GC 總結

Java GC 總結

概述 現在 垃圾回收算法 靜態 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 總結