深入理解Java虛擬機器-垃圾收集演算法及收集器
1,如何判斷物件是否還在被引用?
a,引用計數演算法:給物件新增一個引用計數器,當物件被引用時,計數器+1,當引用失效時,計數器-1,計數器為0時,表示物件已經不再被使用。引用計數法會因為迴圈引用導致物件無法被回收。
b,可達性分析演算法:通過一系列的“GC Roots”作為起始點,從這些點開始向下搜尋,搜尋所有走過的路稱為引用鏈。當一個物件到GC Roots不可達時,表示該物件不再被使用,可以回收了。
2,GC Roots包括:
a,虛擬機器棧中引用的物件
b,方法區中類靜態屬性引用的物件
c,方法區中常亮引用的物件
d,本地方法棧中JNI(Native方法)引用的物件。
3,finalize()方法:任何物件的finalize方法只會被系統自動呼叫一次,在物件被GC時,物件可以通過該方法自救一次,當該物件再次被GC時,虛擬機器不會再次呼叫該方法。
4,標記-清除演算法(Mark-Sweep):通過標記需要回收的物件,然後清楚被標記的物件。
a,效率不高
b,會產生碎片
5,複製演算法(Copying):將記憶體分為兩塊,每次講還在使用的物件複製到另一塊中,然後清理掉當前快的所有記憶體空間。
a,記憶體縮小為一半,代價優點高
b,回收後記憶體沒有碎片
6,HotSpot虛擬機器採用複製演算法,將記憶體分為三塊,兩個Survivor空間,一個Eden空間,空間比例1:1:8。新生物件在Eden區域建立,GC時將Eden中依然存活的物件和一個Survivor中的物件複製到另一個Survivor空間中去。此時浪費的空間只有10%
7,標記-整理演算法(Mark-Compact):通過標記還在使用的物件,並將還在存活的物件都向一端移動,然後清理另外一端的記憶體。
8,分代收集演算法:將Java堆劃分為新生代和老年代,針對不同的年代特點採用適當的收集演算法。
9,Hotspot虛擬機器垃圾收集器如下,中間橫線之上的部分為年輕代垃圾收集器,橫線之下的為老年代垃圾收集器,如果兩個垃圾收集器之間存在連線,說明它們可以搭配使用