資源描述:
《源碼分析:java堆的創(chuàng)建-java開發(fā)java經(jīng)驗(yàn)技巧》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、源碼分析:Java堆的創(chuàng)建-編程開發(fā)技術(shù)源碼分析:Java堆的創(chuàng)建丿京文出處:iceAetcma虛擬機(jī)在內(nèi)存中申請一片區(qū)域,由虛擬機(jī)自動管理,用來滿足應(yīng)用程序?qū)ο蠓峙涞目臻g需求,即堆空間。由于程序運(yùn)行的局部特性,程序創(chuàng)建的大多數(shù)對象都具有菲常短的生命周期,而程序也會創(chuàng)建一些生命周期特別長的對象。簡單的復(fù)制收集器無論對象的生命周期是長是短,都會進(jìn)行復(fù)制操作。而生命周期較長的對象在多次垃圾回收期間內(nèi)并不會被冋收,這就使得這些對象被來冋復(fù)制而使得算法性能大大下降。分代收集把堆分為多個了堆,分別用來存放不同壽命的對象。新生對象空間的將經(jīng)丿力最頻繁的垃圾回收,而對丁經(jīng)丿力了若干次垃圾收集后仍然存活的對
2、象,將成長為成熟對彖,并移動到成熟對象的子堆中,而對老生代子堆的垃圾冋收就不會像新生對象子堆那么頻繁。HotSpot的堆空間分為新生代(YoungGen)和老年代(OldGen,此外還冇位于非堆空間的永久代,但在Java8中將移除永久代),新生代又分為Eden區(qū)和2個Survivor區(qū)(From/To)用以進(jìn)行復(fù)制收集垃圾對彖。對Java堆和對彖的分析將從Java堆的創(chuàng)建開始,然后分析Java對彖的分配與垃圾回收。一、堆的實(shí)現(xiàn)方式在虛擬機(jī)的創(chuàng)建初始化過程屮,通過調(diào)用Universe的成員函數(shù)initialize_heap()將完成Java堆的初始化。在Universe模塊下的初始化將根據(jù)虛擬
3、機(jī)選項(xiàng)來選擇堆的具體實(shí)現(xiàn)方式:1.若虛擬機(jī)配置UseParallelGC,則Java堆的堆類型為ParallclScavcngcIIcap(并行收集堆)//hotspot/sre/share/vm/memory/universe?epp屮if(UseParallelGC){#ifndefSERIALGCUniverse::_collectedHeap二newParallelScavengeHeapO;#else//SERIALGCfatal(z,UseParallelGCnotsupportedinjavakernelvm.〃);#endif//SERIALGC2?若虛擬機(jī)配置UseGIGC
4、,那么將選擇堆類型為GlCollectedHeap,垃圾收集策略將使用專用的GlCollectorPolicy(垃圾優(yōu)先收集)策略elseif(UseGIGC){ttifndefSERIALGCGlCollccto^Policy*glp=newGlCollcctorPolicyBcstRcgionsFirst();GlCollectedHeap*glh=newGlCollectedHeap(glp);Universe::_collectedHeap二glh;#else//SERTALGCfatal("UseGIGCnotsupportedinjavakernelvm.〃);itendif//
5、SERIALGC3.否則,虛擬機(jī)將使用GenCol1ectedHeap(分代收集堆)Universe::_collectedHeap二newGenCol1ectedHeap(gc_policy);各個堆實(shí)現(xiàn)類的類關(guān)系如下:對于默認(rèn)情況下的堆實(shí)現(xiàn),還耍根據(jù)配置選擇垃圾回收策略gc_policy來構(gòu)造一個GenCollectedHeap,這里根據(jù)虛擬機(jī)配置選擇不同的GC策略:(1)?若虛擬機(jī)配置UseSerialGC,那么將使用MarkSweepPolicy(標(biāo)記-清除)策略GenCollectorPolicy*gc_policy;if(UseSerialGC){gc_policy二newMar
6、kSweepPolicy();}~(2).若虛擬機(jī)配置UscConcMarkSwccpGC和UscAdaptivcSizcPolicy,那么將使用ASConcurrcntMarkSwccpPolicy(ill適應(yīng)并發(fā)標(biāo)記-清除)策略,若沒有指定UseAdaptiveSizePolicy,虛擬機(jī)將默認(rèn)使用ConcurrentMarkSweepPolicy(并發(fā)標(biāo)記-清除)策略elseif(UseConcMarkSweepGC){ttifndefSERIALGCif(UscAdaptivcSizcPolicy){gcpolicy=newASConcurrentMarkSweepPolicy();
7、}else{gc_policy=newConcurrentMarkSweepPolicy();}-(1)?若沒冇進(jìn)行配置,虛擬機(jī)將默認(rèn)使用MarkSweepPolicy策略else{//defaultoldgenerationgcpolicy=newMarkSweepPolicy();}~如下表所示:虔擬機(jī)配置參數(shù)內(nèi)存堆實(shí)現(xiàn)回收策略UseParallelGCParallelScavengerHeapGener