資源描述:
《源碼分析:java堆的創(chuàng)建-java開(kāi)發(fā)java經(jīng)驗(yàn)技巧》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、源碼分析:Java堆的創(chuàng)建-編程開(kāi)發(fā)技術(shù)源碼分析:Java堆的創(chuàng)建丿京文出處:iceAetcma虛擬機(jī)在內(nèi)存中申請(qǐng)一片區(qū)域,由虛擬機(jī)自動(dòng)管理,用來(lái)滿足應(yīng)用程序?qū)ο蠓峙涞目臻g需求,即堆空間。由于程序運(yùn)行的局部特性,程序創(chuàng)建的大多數(shù)對(duì)象都具有菲常短的生命周期,而程序也會(huì)創(chuàng)建一些生命周期特別長(zhǎng)的對(duì)象。簡(jiǎn)單的復(fù)制收集器無(wú)論對(duì)象的生命周期是長(zhǎng)是短,都會(huì)進(jìn)行復(fù)制操作。而生命周期較長(zhǎng)的對(duì)象在多次垃圾回收期間內(nèi)并不會(huì)被冋收,這就使得這些對(duì)象被來(lái)冋復(fù)制而使得算法性能大大下降。分代收集把堆分為多個(gè)了堆,分別用來(lái)存放不同壽命的對(duì)象。新生對(duì)象空間的將經(jīng)丿力最頻繁的垃圾回收,而對(duì)丁經(jīng)丿力了若干次垃圾收集后仍然存活的對(duì)
2、象,將成長(zhǎng)為成熟對(duì)彖,并移動(dòng)到成熟對(duì)象的子堆中,而對(duì)老生代子堆的垃圾冋收就不會(huì)像新生對(duì)象子堆那么頻繁。HotSpot的堆空間分為新生代(YoungGen)和老年代(OldGen,此外還冇位于非堆空間的永久代,但在Java8中將移除永久代),新生代又分為Eden區(qū)和2個(gè)Survivor區(qū)(From/To)用以進(jìn)行復(fù)制收集垃圾對(duì)彖。對(duì)Java堆和對(duì)彖的分析將從Java堆的創(chuàng)建開(kāi)始,然后分析Java對(duì)彖的分配與垃圾回收。一、堆的實(shí)現(xiàn)方式在虛擬機(jī)的創(chuàng)建初始化過(guò)程屮,通過(guò)調(diào)用Universe的成員函數(shù)initialize_heap()將完成Java堆的初始化。在Universe模塊下的初始化將根據(jù)虛擬
3、機(jī)選項(xiàng)來(lái)選擇堆的具體實(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);各個(gè)堆實(shí)現(xiàn)類的類關(guān)系如下:對(duì)于默認(rèn)情況下的堆實(shí)現(xiàn),還耍根據(jù)配置選擇垃圾回收策略gc_policy來(lái)構(gòu)造一個(gè)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)記-清除)策略,若沒(méi)有指定UseAdaptiveSizePolicy,虛擬機(jī)將默認(rèn)使用ConcurrentMarkSweepPolicy(并發(fā)標(biāo)記-清除)策略elseif(UseConcMarkSweepGC){ttifndefSERIALGCif(UscAdaptivcSizcPolicy){gcpolicy=newASConcurrentMarkSweepPolicy();
7、}else{gc_policy=newConcurrentMarkSweepPolicy();}-(1)?若沒(méi)冇進(jìn)行配置,虛擬機(jī)將默認(rèn)使用MarkSweepPolicy策略else{//defaultoldgenerationgcpolicy=newMarkSweepPolicy();}~如下表所示:虔擬機(jī)配置參數(shù)內(nèi)存堆實(shí)現(xiàn)回收策略UseParallelGCParallelScavengerHeapGener