垃圾回收系列(3):CLR與JVM垃圾回收器的比較_第1頁
垃圾回收系列(3):CLR與JVM垃圾回收器的比較_第2頁
垃圾回收系列(3):CLR與JVM垃圾回收器的比較_第3頁
垃圾回收系列(3):CLR與JVM垃圾回收器的比較_第4頁
垃圾回收系列(3):CLR與JVM垃圾回收器的比較_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

垃圾回收系列(3):CLR與JVM垃圾回收器的比較發(fā)布者:TerryLee|分類:.NET框架|Java技術(shù)|計算機科學本文為垃圾回收講座的第三篇,在前面兩篇(一、二)文章里介紹了手工管理內(nèi)存帶來的一些問題,以及一些經(jīng)典的GC算法。本文我們主要關(guān)注微軟的CLR與JVM垃圾回收器方面的比較。我們知道CLR和JVM都采用了分代式垃圾回收器,而分代式垃圾回收器則基于以下幾點假設(shè):對象越新,其生存期就越短對象越老,其生存期就越長對堆的一部分執(zhí)行GC比對整個堆執(zhí)行GC要快CLR和JVM盡管都采用了分代式垃圾回收器,但是它們在很多處理方面都有些不同:分代機制,大對象堆,回收模式,回收算法,尋找存活對象效率等。分代機制F根集合在CLR中,對象按年齡可以分為三代:第0代、第1代、第2代,如下圖所示:SOHNextPtr第F根集合在CLR中,對象按年齡可以分為三代:第0代、第1代、第2代,如下圖所示:SOHNextPtr第0代第2代I:卜代在這三代之間,對象代的提升過程,大家可以參考《CLRviaC#》,里面有比較詳細的介紹。JVM中對于對象的分代式新生代和舊生代:

Heap回收模式在CLR4.0之前,提供三種不同的垃圾回收模式:工作站并發(fā)GC、工作站非并發(fā)GC以及服務(wù)器GC,如下圖所示:CLR三種GC工作站并發(fā)GC工作站非并發(fā)GC服務(wù)器GCConcurrentWSNonServerGCConcurrentWS工作站非并發(fā)GC模式,沒有專門的GC線程,而是由工作線程負責回收,在回收過程中,需要暫時掛起應(yīng)用程序,回收結(jié)束后應(yīng)用程序繼續(xù)運行,所以在回收過程中會有應(yīng)用程序暫停現(xiàn)象:

Air^tatKiaAir^tatKiaThreetfi*AliMatiAf拓u占p也T*h電!日2(AH-Kati<igThread3*Su^tndK]?工作站并發(fā)GC模式,為了解決在執(zhí)行垃圾回收時引起的應(yīng)用程序暫停問題,會有一個專門的GC線程負責垃圾回收,大多數(shù)時間垃圾回收都可以應(yīng)用程序并發(fā)執(zhí)行,但是僅僅是針對FullGC,而對于第0代、第1代對象,仍然會使用非并發(fā)模式執(zhí)行,并發(fā)垃圾回收本質(zhì)上犧牲了更多的CPU時間和內(nèi)存來換取應(yīng)用程序暫停時間的減?。篈irouEiriQAllccanngAirouEiriQThir*ad1?WAlt\cjca?AlocatingThf已AllocitincThftad3?Suspfrtdec■h服務(wù)器GC模式運行在多CPU服務(wù)器上,如果在單CPU機器上配置了使用服務(wù)器GC,不會起任何作用,垃圾回收仍然會使用工作站非并發(fā)模式執(zhí)行。服務(wù)器GC模式為每個CPU分配一個專用的垃圾回收線程和一個托管堆,并且該垃圾回收線程具有較高的優(yōu)先級,在執(zhí)行垃圾回收期間,應(yīng)用程序工作線程會暫時掛起:

CLR4.0中提供了后臺垃圾回收機制,用于取代并發(fā)GC。JVM(以Hotspot為例)中使用的垃圾回收更為復雜,針對新生代、舊生代在工作站和服務(wù)器上,分別使用不同的垃圾回收模式,如下圖所示:在Client端默認的方式為串行GC,而在服務(wù)端,對于新生代和舊生代默認的方式分別為:并行回收GC和并行GC:

新生代GG舊生代GGClient串行GC串行GCServer并彳丁回收GC并行GC下圖體現(xiàn)了默認串行GC與并行GC之前的區(qū)別,并行GC會把堆分成多個區(qū),分區(qū)進行標記和回收,但這兩種方式都會引起應(yīng)用程序的暫停:DcfauUCopyingCollaGtorPar^llalColloctor下圖體現(xiàn)了默認的標記縮并回收與并發(fā)GC,在并發(fā)GC中,標記的總共分為三個階段,分別為initialMark、ConcurrentMarking和Remark,只有在InitialMark和Remark階段才會引起應(yīng)用程序暫停,而在ConcurrentMarking和清除階段都是與應(yīng)用程序并發(fā)執(zhí)行,并不會引起暫停:Gotl?ctorGotl?ctorcollectorI;V5'MCancurrontMsrkjng-I;V5'MCancurrontMsrkjng-RemarkYLC&ncurrontSwooping回收算法在CLR中有專門的大對象堆(LOH),超過85000字節(jié)的對象將會分配在LOH上面,只有在進行第2代對象垃圾回收時才會同時對LOH進行回收,即一次FullGC。第0代、第1代、第2代對象所在的堆稱之為小對象堆(SOH)。在CLR中,對于小對象堆SOH,采用的回收算法為標記-縮并算法,由于移動大對象比較耗費時間,所以在LOH上,CLR采用了標記-清除算法,即只做對象的清除并不對大對象堆進行壓縮。在JVM中,對于新生代對象采用節(jié)點復制算法進行回收,這也是為什么我們在上面的圖中,新生代對象堆分為S0和S1的原因,有時也稱之為為From和To;對于舊生代對象根據(jù)不同的回收模式,采用不同的回收算法:串行GC:標記-縮并算法(滑動縮并)并行GC:標記-縮并算法并發(fā)GC:標記-清除算法提高查找存活對象的效率現(xiàn)在考慮這樣一個問題,只對第0代(或者新生代)對象做回收,在查找存活對象過程中(不關(guān)是標記-縮并還是節(jié)點復制算法),從根集合開始,如果發(fā)現(xiàn)有一個根對象指向了第1代、第2代(或者舊生代),為了提高效率,垃圾回收器將會立即終止這條線上的查找:托管堆根集合Gen0托管堆根集合Gen0XGen1Gen2這樣帶來的一個問題是:如果在第o代(或者新生代)分配的對象x,沒有根對象指向它,但有一個第1代或者第2代(舊生代)的對象,指向了該新創(chuàng)建的對象:Gen0XGenGenGen0XGenGen2根集合■托管堆此時雖然沒有根對象可以到達新創(chuàng)建的對象X,但由于有其他代的對象指向它,所以它仍然不能當做垃圾回收,為了解決這個問題,人們提出了各種解決方案,常見的有:記憶集硬件標記虛擬頁面標記字標記卡標記由于硬件標記需要特定的硬件平臺來支持,所以不具有可移植性,現(xiàn)在更多的垃圾回收器都使用了軟件解決方案,在CLR和JVM上都使用了卡標記技術(shù),即把托管堆分成一個一個的卡片,這個卡片代表一個抽象的概念(卡片的大小可以等于一個字,也可以等于一個虛擬頁面)。如果有卡片上的對象發(fā)生了變化,則在CardTable中做一個標記,在查找存活對象時,除了要查找根對象之外,還有查找CardTable中標記的對象所引用的對象:在CLR和JVM上所使用的卡片大小也不相同,CLR為128字節(jié)一個卡片,而JVM上為512字節(jié)一個卡片。在更新卡片過程中,它們都是按字節(jié)(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論