天天看點

垃圾回收機制的工作原理

java的垃圾回收機制也可以稱為"自适應的,分代的,停止-複制,标記-清掃"式垃圾回收器.

很多比較高效的垃圾回收機制的思想是:從建立的對象後的堆棧或者靜态存儲區開始,依次去周遊所有的對象引用,隻要發現對象'死'了,就釋放這個對象的存儲空間.

而java虛拟機就是在這種方式下,采用的是一種自适應的垃圾回收機制.在說java垃圾回收機制之前,先介紹幾種回收記憶體的方法:

停止--複制法:進行這種方法時,線必須要停止程式運作,這就表明它并不屬于背景程式.暫停程式運作後,就會将存活的對象從目前堆複制到另一個堆,沒有被複制的全部是垃圾.對象被複制到新堆後,或緊挨着排列,然後就可以繼續的配置設定空間了.但是這種方式會降低效率.主要原因有兩個:第一,必須要有兩個堆,在兩個堆來回複制時就會花費比實際多一倍的空間.第二,複制這些對象時會花費時間.因為但這些堆裡面的對象很少死亡的話,産生的垃圾就會很少,這樣來回複制就等于浪費時間.這種情況下.java虛拟機就會轉到另一種模式:标記--清掃模式.

标記--清掃模式:同樣是從堆棧或者靜态存儲區出發,周遊所有的引用找到所有存活的對象.每找到一個存活的對象就給對象一個标記,這個過程不會回收任何對象.當标記工作全部完成之後,清理工作才會開始.清理時,沒有被标記的對象會被釋放,并且不會放生任何的複制現象.但是清理之後的堆空間是不連續的.

(停止--複制和标記--清掃都是在記憶體數量變少之後才會停止程式去釋放記憶體)

在java虛拟機中,配置設定記憶體都以較大"塊"為機關.這樣是友善拷貝對象.每個塊中都有相應的代數,來記錄這個塊是否存活.通常塊中的某處被引用代數就會增加.垃圾回收器會對每次回收動作之後的塊進行着整理.

垃圾回收器工作原理:垃圾回收器會定期的進行清理工作:大型的對象不會被複制,但其代數會增加,内含小型的對象的那些塊會被複制并整理.java虛拟機會對其進行監視,如果所有的對象都比較穩定,垃圾回收器效率降低,則自動轉為"标記--清掃"模式,同樣java虛拟機如果發現腿腫的對象出現很多不連續的的現象,則會變為"停止--複制"模式.這就是java虛拟機垃圾回收機制的"自适應"技術.這也是垃圾回收機制頁腳開始的那個名稱的原因.