內存管理機制-JVM 垃圾回收算法

RoadMap

 

什麼是垃圾回收

```算法

     虛擬機將再也不會被使用的對象進行回收處理,其實也就是將這些對象(稱爲死亡對象)從內存中消除,釋放內存空間優化

```spa

如何判斷死亡對象(對象可觸及性算法)

 

可觸及性算法是判斷對象是否死亡的最基本的算法。所謂死亡對象就是內存堆中再也不使用的對象。 
用於被GC回收的對象。指針

1. 引用計數算法 Reference Counting

引用計數法是給對象中添加一個引用計數器,每當有一個地方引用它時,計數器加1, 
當引用失效時,計數器減1;任什麼時候候計算器都爲0的對象就是不可觸及的對象。對象

Reference Counting 斷定效率高,實現簡單。 
微軟的COM,ActionScript3,FlashPlayer3,Python 都採用Reference Counting來計算ip

Java 語言中沒有采用這個算法的主要緣由是,它難以解決循環引用的問題。內存

2. 根搜索算法 GC Root Tracing

基本思路就是就是經過一系列名爲 GC Root 的對象做爲起始點,從這些節點開始向下搜索, 
搜索走過的路勁做爲引用鏈,當一個對象到GC Root 沒有任何引用鏈時,則證實此對象不可觸及ci

GC Root 包括如下幾種虛擬機

  • 虛擬機棧中的引用的對象io

  • 方法區中的類靜態屬性引用的對象

  • 方法區中的常量引用的對象

  • 本地方法棧中JNI的引用的對象。

垃圾回收算法

1. 標記-清楚算法 Mark-Sweep

標記-清楚算法是最基本的算法,其算法分爲兩個階段,標記階段和清除階段。 
首先標記出所須要回收的對象,標記完成後統一收掉全部的被標記的對象。

他的缺點主要有兩個:

  • 效率問題,標記和清除的效率都不高

  • 空間問題,標記清除後會產生大量的碎片內存

2. 複製算法 Copying

爲了解決效率問題,複製算法將可用內存分爲大小相等的兩塊,每次只用其中一塊。 
當一塊內存用完了,就將還存活着的對象複製到另一塊上面,而後把已用過的內存空間一次清理掉。

內存分配不用考慮碎片等複雜狀況,只要移動堆頂指針,實現簡單,運行高效。只是這種算法的代價是將內存縮小爲原來的一半。

** 
在實際應用中,不會簡單的把全部存活對象從一邊拷貝到另一邊,通過優化,會把大對象放到老生代的內存區域中,這一動做其實就是內存分配擔保的一個動做(Handle Promotion)。 
咱們沒有辦法保證每次須要複製的內存對象 在另外一塊區域必定夠,這時須要借一塊區域一般來講是老年代存放,在清理以後在放回去,或者說就長期放在老年代了。 
**

3. 標記-壓縮算法 Mark-Compact

標記-壓縮算法是 標記-清除算法的一種優化,標記過程仍然同樣,但後續步驟不是直接對可回收對象進行清理,而是讓全部存活的對象都向一端移動,而後直接清理掉端邊界之外的內存。

分代收集 General Collection

所謂分代收集實際上是各類回收算法的綜合應用。根據對象的存活週期的不一樣將內存劃分爲幾塊。通常是把Java堆分爲新生代和老年代。  新生代中,每次垃圾收集時都要發現大批對象死去,只有少許存活,那就選用複製算法,只需付出少許存活對象的複製。  而老年代中由於對象的存活率高,沒有額外的空間對它進行分配擔保,就必須使用標記清理或者壓縮算法。

相關文章
相關標籤/搜索