1. 程式人生 > >java幾種垃圾收集方法

java幾種垃圾收集方法

標記清除法:

分為兩個階段,標記----清除

標記階段將所有需要回收的物件做標記,然後在清除階段將所有的標記物件回收

但是這種回收方法有很大的缺點,那就是這兩個過程的的效率並不高,兩個過程都是效率很低的過程

另外一個缺點就是標記清除之後,因為之前並沒有移動物件,每個標記的物件在空間的各個位置,清除

之後會有很多不連續的記憶體,在遇到需要分配一個比較大的物件的時候,會出現雖然總量上有空間容納,

但實際上因為這些記憶體不連續無法分配一個連續的較大的記憶體給這個較大物件的情況,而導致系統再次

觸發一次GC

複製演算法:

複製演算法是將空間分為兩個大小相等的部分,每次只使用其中的一塊,然後這一塊用完之後就將自己裡面的

還存活著的物件複製到另一塊裡面去,這樣的好處就是清除之後產生的記憶體不會出現不連續的情況,但缺點

也很明顯,那就是需要將記憶體縮小一半,這樣看來這種代價太大,所以之後的複製演算法在這上面做出改進,將

記憶體分為了三個區域,一個Eden區域和兩個survivor區域(大小為8/1/1,值得提醒的是這裡所說的都是新生代),

將在回收時將Eden區域和其中一個survivor中的存活的物件複製到另一個survivor中,然後將這這兩個清理,

相比於1/1的那種複製,顯然這種只浪費1/10的的空間,那麼這裡要問了,其實我當時也提出了這樣的問題,假如

存活物件是大於survivor的,那該怎麼辦,書上給瞭解釋就是需要依賴其他記憶體來作為擔保.細節先不談,還有就是

這種複製演算法,在存活物件比較多的情況下,比如老年代,效率自然就變低.所以產生了接下來這種演算法

標記整理演算法:

這演算法之前的步驟跟第一個標記清除一樣,將物件一一標記,但之後不同的是不對物件進行處理,而是將存活物件向一端移動

然後清理另一邊的記憶體,這種演算法更適用於老年代

分代收集:

其實就是因地制宜思想,在新生代這種會有大量物件死去的時候,採用複製演算法,因為需要複製的記憶體少,而在老年代

就採用標記清理或者標記整理

這本書還繼續看,持續更新~