如前所述,默認(rèn)狀態(tài)下HotSpot對(duì)新域使用復(fù)制收集器,對(duì)舊域使用標(biāo)記-清除-壓縮收集器。在新域中使用復(fù)制收集器有很多意義,因?yàn)閼?yīng)用程序生成的大部分對(duì)象是短壽命的。理想狀態(tài)下,所有過渡對(duì)象在移出Eden空間時(shí)將被收集。如果能夠這樣的話,并且移出Eden空間的對(duì)象是長(zhǎng)壽命的,那么理論上可以立即把它們移進(jìn)舊域,避免在救助空間反復(fù)復(fù)制。但是,應(yīng)用程序不能適合這種理想狀態(tài),因?yàn)樗鼈冇幸恍〔糠种虚L(zhǎng)壽命的對(duì)象。最好是保持這些中長(zhǎng)壽命的對(duì)象并放在新域中,因?yàn)閺?fù)制小部分的對(duì)象總比壓縮舊域廉價(jià)。為控制新域中對(duì)象的復(fù)制,可用-XX:TargetSurvivorRatio控制救助空間的比例(該值是設(shè)置救助空間的使用比例。如救助空間位1M,該值50表示可用500K)。該值是一個(gè)百分比,默認(rèn)值是50。當(dāng)較大的堆棧使用較低的sruvivorratio時(shí),應(yīng)增加該值到80至90,以更好利用救助空間。用-XX:maxtenuring threshold可控制上限。
為放置所有的復(fù)制全部發(fā)生以及希望對(duì)象從eden擴(kuò)展到舊域,可以把MaxTenuring Threshold設(shè)置成0。設(shè)置完成后,實(shí)際上就不再使用救助空間了,因此應(yīng)把SurvivorRatio設(shè)成最大值以最大化Eden空間,設(shè)置如下:
java … -XX:MaxTenuringThreshold=0 –XX:SurvivorRatio=50000 …
4.BEA JRockit JVM的使用 Bea WebLogic 8.1使用的新的JVM用于Intel平臺(tái)。在Bea安裝完畢的目錄下可以看到有一個(gè)類似于jrockit81sp1_141_03的文件夾。這就是Bea新JVM所在目錄。不同于HotSpot把Java字節(jié)碼編譯成本地碼,它預(yù)先編譯成類。JRockit還提供了更細(xì)致的功能用以觀察JVM的運(yùn)行狀態(tài),主要是獨(dú)立的GUI控制臺(tái)(只能適用于使用Jrockit才能使用jrockit81sp1_141_03自帶的console監(jiān)控一些cpu及memory參數(shù))或者WebLogic Server控制臺(tái)。
Bea JRockit JVM支持4種垃圾收集器:
4.1.1.分代復(fù)制收集器 它與默認(rèn)的分代收集器工作策略類似。對(duì)象在新域中分配,即JRockit文檔中的nursery。這種收集器最適合單cpu機(jī)上小型堆操作。
4.1.2.單空間并發(fā)收集器 該收集器使用完整堆,并與背景線程共同工作。盡管這種收集器可以消除中斷,但是收集器需花費(fèi)較長(zhǎng)的時(shí)間尋找死對(duì)象,而且處理應(yīng)用程序時(shí)收集器經(jīng)常運(yùn)行。如果處理器不能應(yīng)付應(yīng)用程序產(chǎn)生的垃圾,它會(huì)中斷應(yīng)用程序并關(guān)閉收集。
分代并發(fā)收集器 這種收集器在護(hù)理域使用排它復(fù)制收集器,在舊域中則使用并發(fā)收集器。由于它比單空間共同發(fā)生收集器中斷頻繁,因此它需要較少的內(nèi)存,應(yīng)用程序的運(yùn)行效率也較高,注意,過小的護(hù)理域可以導(dǎo)致大量的臨時(shí)對(duì)象被擴(kuò)展到舊域中。這會(huì)造成收集器超負(fù)荷運(yùn)作,甚至采用排它性工作方式完成收集。
4.1.3.并行收集器 該收集器也停止其他進(jìn)程的工作,但使用多線程以加速收集進(jìn)程。盡管它比其他的收集器易于引起長(zhǎng)時(shí)間的中斷,但一般能更好的利用內(nèi)存,程序效率也較高。
默認(rèn)狀態(tài)下,JRockit使用分代并發(fā)收集器。要改變收集器,可使用-Xgc:
,對(duì)應(yīng)四個(gè)收集器分別為gencopy,singlecon,gencon以及parallel。可使用-Xms和-Xmx設(shè)置堆的初始大小和最大值。要設(shè)置護(hù)理域,則使用-Xns:java –jrockit –Xms512m –Xmx512m –Xgc:gencon –Xns128m…盡管JRockit支持-verbose:gc開關(guān),但它輸出的信息會(huì)因收集器的不同而異。JRockit還支持memory、load和codegen的輸出。
注意 :如果 使用JRockit JVM的話還可以使用WLS自帶的console(C:\bea\jrockit81sp1_141_03\bin下)來監(jiān)控一些數(shù)據(jù),如cpu,memery等。要想能構(gòu)監(jiān)控必須在啟動(dòng)服務(wù)時(shí)startWeblogic.cmd中加入-Xmanagement參數(shù)。