j2se 5.0 hotspot 的四種記憶體回收行程

來源:互聯網
上載者:User

以下內容自sun白皮書1-150020中找到,由於加上我自己的理解,所以不是翻譯文章(英語不給力,翻譯不好).其中我只關注了回收的抽象機制,對於引用計數,具體演算法等未涉及.

hotspot(j2se 5.0,按白皮書上的說法也適用於6.0)使用的是所謂的Generational Collection機制,也就是把對象分為young和old(還有一種是permanent,暫時不鳥他),young對象經過幾次回收後(存活較長時間後),就會成為old對象.之所以採用這種機制,是基於以下觀察:大部分建立對象的引用不會持續太久,也就說是會die
young;少部分的引用會持續下來.

因此,young generation
進行Collection會更多,因此使用的演算法對時間效率的要求高.而old
generation 儲存的資料較多,使用的演算法對空間的要求效率相對而言要求就較高了.把對象分為不同的generation,便於採用不同的演算法進行操作.

對應的,可以把HotSpotJVM 的記憶體分為:young
generation ,oldgeneration ,permanent generation.在這裡預設首先把對像都放到地區的左邊.


J2SEHotSpot JVM
的 4中記憶體回收行程都是屬於generational collection.

一般說來,建立對象時一般都是在young裡面分配記憶體,old裡面儲存的是young中經過幾次回收依然存活的對象以及一些一開始就在old中分配的大對象.而permanent
generation裡面儲存的是類資訊和中繼資料.

younggeneration分為一個Eden地區和兩個survivor
地區.對象在Eden地區產生,經過一次GC後存活下來的對象進入survivor中,並在此經過更嚴格的考驗,然後進入old
.同一時間只有一個survivor地區儲存對象,另一個為空白.

 

當young地區滿了後,就會執行young地區的GC演算法.當old和permanent地區滿了後,會先執行young的GC.再執行old和permanent的GC,如果old地區對象過多無法執行young的GC,那麼在young地區執行old的GC演算法(因為記憶體空間耗費較少),但是CMS回收器的old演算法不行,下面會說明原因.

 

對於多線程的應用.JVM
使用一個Thread-LocalAllocation Buffers ,為每個線程分配一個地區來指派至,以排除線程競爭.如果此地區滿了的話就使用鎖.

 

HotSpot的四種GC
回收器:

序列化回收serial collector:

特點:回收時會暫停應用.

young地區:將Eden和某個Survivor地區中的存活的對象複製到另一個Survivor地區(設為TO)(大對象直接放到old地區).如果TO地區滿了,則直接複製到old地區.

old地區:使用mark-sweep-compact GC演算法,也就是先標記存活對象,然後清除廢棄對象,然後把存活對象都移到一塊地區,空出一片較大的空閑空間.

適用範圍:大部分用戶端的應用都可以使用這種回收演算法,這也是HotSpot預設的回收演算法.在現在的機器(06年)上一個64MB的地區的一次完全回收所需的時間不到半秒鐘.

 

並行回收parallel collector:

特點:可以利用多核的CPU.

young地區:同樣還是要暫停應用,基本機制和序列化差不多,不過是使用多線程.可以加快效率.

old地區:同序列化.

多核電腦上面可以使用.

 

並行壓縮回收parallel compacting collector:

與並行回收相比,主要是在old地區有個新的演算法,同時,按白皮書的說法,這種回收最終會替代並行回收.

young地區:同並行回收.

old地區:首先,把old分為幾個連續的地區.然後,在每個地區並行的進行檢查,標記出alive的對象(先標記出可以直接引用的對象,然後是所有的).然後開始對這些地區進行檢查,得出密集程度(左邊的地區肯定比右邊的密集),從某個密集程度不很高的地區開始,並行的對右邊地區進行壓縮.

適應範圍:對於多核,且對pause time有要求的環境下,使用並行壓縮回收比並行回收要好.但是對於高共用率的伺服器(也就說一台伺服器運行多個應用),由於old地區的collection較慢,又是多線程,所以一個應用的GC會對其他應用造成影響.對應的解決方案:可以配置減少並行時的線程數目.

 

並行標記清除回收Concurrent Mark Sweep collector:

young地區:同並行回收.

old地區:分為幾個步驟.

Initialmark:在需要執行GC時,先暫停應用,然後把所有直接引用到的對象進行標記.

Concurrentmark:然後繼續應用,並同時對已標記對象進行檢查,得到所有存活的對象.

remark:再次暫停應用,對Concurrent mark持續期間應用程式修改了的對象進行檢查(新增的,廢棄的),並標記存活對象.這個階段期間較長,因此會使用多線程.在階段結束後,所有的存活對象都被標記了,未標記的對象就是垃圾對象了.

sweep:停止暫停應用程式,然後把所有垃圾對象的空間釋放.

 

與其他演算法的不同點:

第一:不執行壓縮.不過會通過計算將來可能的記憶體需求而合并/分割某些記憶體塊.

第二:不是old地區要滿了才執行GC,而是在空間小於一定程度時開始.

第三:由於沒執行壓縮,因此會產生片段.

另外,CMS還可以使用增量運行方式,就是在Concurrentmark階段只執行一部分工作,然後把資源還給應用程式.回收器的工作會分為幾個部分並安排在兩次young地區的回收空閑階段完成.這種模式一般用在對暫停時間有要求,同時處理器數目不多的情況下(單核或雙核).

總體說來,與並行回收相比,CMS降低了old GC的暫停時間(有時候效果很顯著),輕微的加長了young
GC的時間(因為對象從young地區轉到old地區時間會加長:沒執行壓縮,因此要先找到合適的地區),降低了整個系統的一些執行效率,以及很大的加強了對於記憶體空間的需求.

 

適用範圍:對暫停時間有要求,伺服器能夠分配一些資源給GC線程.一般說來,適用於應用相對而言有一些比較大的old
generation,並且是多核處理器的伺服器.比如說web server(這裡特別指明web server了)

 

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.