JVM 《三》調(diào)優(yōu)策略 及 性能注意事項 測量及方式

性能注意事項

垃圾收集性能有兩個主要指標(biāo)。?吞吐量是在長時間內(nèi)考慮的未用于垃圾收集的總時間的百分比。吞吐量包括分配所花費的時間(但通常不需要調(diào)整分配速度。)?暫停是應(yīng)用程序因為垃圾收集正在發(fā)生而無響應(yīng)的時間。

用戶對垃圾收集有不同的要求。例如,有些人認(rèn)為Web服務(wù)器的正確度量標(biāo)準(zhǔn)是吞吐量,因為垃圾收集期間的暫停可能是可以容忍的,或者只是被網(wǎng)絡(luò)延遲所掩蓋。但是,在交互式圖形程序中,即使短暫停頓也可能對用戶體驗產(chǎn)生負(fù)面影響。

一些用戶對其他考慮因素很敏感。?足跡是一個過程的工作集,以頁面和緩存行來衡量。在具有有限物理內(nèi)存或許多進程的系統(tǒng)上,占用空間可能會影響可伸縮性。?提示性是指對象變?yōu)樗劳龊蛢?nèi)存可用之間的時間,這是分布式系統(tǒng)的一個重要考慮因素,包括遠(yuǎn)程方法調(diào)用(RMI)。

通常,特定的一代尺寸選擇在這些考慮之間進行權(quán)衡。例如,非常大的?年輕一代可以最大化吞吐量,但這樣做是以占用空間,及時性和暫停時間為代價的。?年輕一代的停頓可以用一個小的最小化?的年輕的吞吐量為代價產(chǎn)生。對于第一近似,一代的大小不影響另一代的收集頻率和暫停時間。

沒有一種正確的方法來規(guī)?;?。最佳選擇取決于應(yīng)用程序使用內(nèi)存的方式以及用戶要求。因此,虛擬機對垃圾收集器的選擇并不總是最佳的,并且可以由用戶以命令行選項的形式覆蓋。


垃圾收集器,堆和運行時編譯器

在J2SE平臺版本1.4.2中,默認(rèn)情況下進行了以下選擇

串行垃圾收集器

堆大小

初始堆大小為4 MB

最大堆大小為64 MB

客戶運行編譯器

在J2SE平臺版本5.0中,一類稱為服務(wù)器級機器的機器已被定義為具有的機器

2個或更多物理處理器

2個或更多GB的物理內(nèi)存

默認(rèn)情況下,在服務(wù)器級計算機上選擇以下內(nèi)容。

吞吐量垃圾收集器

堆大小

初始堆大小為1/64的物理內(nèi)存,最大為1Gbyte

最大堆大小為1/4的物理內(nèi)存,最大為1Gbyte

Server runtime編譯器


基于行為的調(diào)整

在J2SE平臺版本5.0之前,針對垃圾收集的調(diào)優(yōu)主要包括指定整個堆的大小以及可能堆中的代的大小。調(diào)整垃圾收集的其他控制措施包括年輕一代幸存者空間的大小以及從年輕一代到老一代的晉升門檻。調(diào)整需要使用這些參數(shù)的不同值進行一系列實驗,并使用專門的工具或只是做出好的判斷來決定垃圾收集何時表現(xiàn)良好。

在版本5.0中,引入了基于應(yīng)用程序的期望行為的兩個參數(shù)。這些是

最大暫停時間目標(biāo)

應(yīng)用吞吐量目標(biāo)。

設(shè)置這些目標(biāo)可用于調(diào)整垃圾收集。應(yīng)該強調(diào)的是,目標(biāo)不能總是得到滿足。應(yīng)用程序需要足夠大的堆以至少保存所有實時數(shù)據(jù)。最小堆大小我無法達到這些預(yù)期目標(biāo)。


最大暫停時間目標(biāo)

暫停時間是垃圾收集器停止應(yīng)用程序并恢復(fù)不再使用的空間的持續(xù)時間。最大暫停時間目標(biāo)的意圖是限制這些暫停的最長時間。垃圾收集器維持平均停頓時間和平均時差。平均值是從執(zhí)行開始時獲得的,但是經(jīng)過加權(quán),以便更近期的暫停次數(shù)更多。如果平均加上暫停時間的方差大于最大暫停時間目標(biāo),則垃圾收集器認(rèn)為目標(biāo)未得到滿足。

使用命令行標(biāo)志指定最大暫停時間目標(biāo)

-XX:MaxGCPauseMillis = <NNN>

這被解釋為垃圾收集器的提示,需要<nnn>毫秒或更短的暫停時間。垃圾收集器將調(diào)整Java堆大小和其他與垃圾收集相關(guān)的參數(shù),以試圖使垃圾收集暫停時間小于<nnn>毫秒。默認(rèn)情況下,沒有最大暫停時間目標(biāo)。這些調(diào)整可能導(dǎo)致垃圾收集器更頻繁地發(fā)生,從而降低了應(yīng)用程序的整體吞吐量。在某些情況下,無法滿足所需的暫停時間目標(biāo)。


吞吐量收集器是世代收集器,因此年輕一代和老一代有單獨的集合。平均值和方差分別為每一代保留。最大暫停時間目標(biāo)分別應(yīng)用于平均值加上每一代集合的方差。每一代可能單獨地?zé)o法滿足暫停時間目標(biāo)。


吞吐量目標(biāo)

吞吐量目標(biāo)是根據(jù)收集垃圾所花費的時間和垃圾收集之外的時間(稱為應(yīng)用程序時間)來衡量的。目標(biāo)由命令行標(biāo)志指定

-XX:GCTimeRatio = <NNN>

垃圾收集時間與應(yīng)用時間的比率是

1 /(1 + <nnn>)

例如-XX:GCTimeRatio = 19設(shè)置1/20的目標(biāo)?個或總時間為垃圾收集5%。


垃圾收集所花費的時間是年輕一代和老一代收藏相結(jié)合的總時間。如果未滿足吞吐量目標(biāo),則增加代的大小以努力增加應(yīng)用程序在集合之間運行的時間。


足跡目標(biāo)

如果已滿足吞吐量和最大暫停時間目標(biāo),則垃圾收集器會減小堆的大小,直到無法滿足其中一個目標(biāo)(總是吞吐量目標(biāo))。然后解決未達到的目標(biāo)。


調(diào)整策略

除非您知道需要大于默認(rèn)最大堆大小的堆,否則不要為堆選擇最大值。選擇足以滿足您應(yīng)用程序的吞吐量目標(biāo)。

堆將增大或縮小到支持所選吞吐量目標(biāo)的大小??梢灶A(yù)期在初始化期間和應(yīng)用程序行為發(fā)生變化期間堆大小的一些振蕩。

如果堆增長到最大值,則在大多數(shù)情況下這意味著在最大堆大小內(nèi)無法滿足吞吐量目標(biāo)。將最大堆大小設(shè)置為接近平臺上的總物理內(nèi)存但不會導(dǎo)致應(yīng)用程序交換的值。再次執(zhí)行該應(yīng)用程序。如果仍未滿足吞吐量目標(biāo),則應(yīng)用程序時間的目標(biāo)對于平臺上的可用內(nèi)存來說太高。

如果可以滿足吞吐量目標(biāo),但暫停時間過長,請選擇最大暫停時間目標(biāo)。選擇最大暫停時間目標(biāo)可能意味著您的吞吐量目標(biāo)將無法滿足,因此請選擇對應(yīng)用程序可接受的折衷值。


當(dāng)垃圾收集器試圖滿足競爭目標(biāo)時,堆的大小通常會振蕩。即使應(yīng)用程序已達到穩(wěn)定狀態(tài),也是如此。實現(xiàn)吞吐量目標(biāo)(可能需要更大的堆)的壓力與目標(biāo)競爭最大暫停時間和最小占用空間(兩者都可能需要小堆)。


其他變化

線程局部分配緩沖區(qū)

重新調(diào)整了線程局部分配緩沖區(qū)的大小。當(dāng)線程局部分配緩沖區(qū)填滿時,新緩沖區(qū)的大小取決于線程的分配模式。分配更多內(nèi)存的線程將獲得更大的緩沖區(qū)。


測量及方式

使用特定于應(yīng)用程序的度量來最好地測量吞吐量和占用空間。例如,可以使用客戶端負(fù)載生成器測試Web服務(wù)器的吞吐量,而可以使用pmap命令在Solaris操作系統(tǒng)上測量服務(wù)器的占用空間。另一方面,通過檢查虛擬機本身的診斷輸出,可以容易地估計由于垃圾收集引起的暫停。

命令行參數(shù)-verbose:gc在每個集合上打印信息。請注意,-verbose:gc輸出的格式可能會在J2SE平臺的發(fā)行版之間發(fā)生變化。例如,這是從大型服務(wù)器應(yīng)用程序輸出:

? [GC 325407K-> 83000K(776768K),0.2300771 secs]?

? [GC 325816K-> 83372K(776768K),0.2454258 secs]?

? [Full GC 267628K-> 83769K(776768K),1.8479984 secs]

在這里,我們看到兩個小集合和一個主要集合。箭頭前后的數(shù)字

325407K-> 83000K(第一行)


表示垃圾收集前后活動對象的總大小。在次要集合之后,計數(shù)包括不一定存活但不能被回收的對象,因為它們直接存活,或者因為它們在終身代內(nèi)或從其中引用?。括號中的數(shù)字

(776768K)(在第一行)


是總可用空間,不計算永久代的空間?,即總堆減去一個幸存者空間。次要收藏大約花了四分之一秒。

0.2300771秒(第一行)

第三行中主要集合的格式類似。標(biāo)志-XX:+ PrintGCDetails打印有關(guān)集合的其他信息。使用此標(biāo)志打印的附加信息可能隨每個版本的虛擬機而更改。帶有-XX:+ PrintGCDetails標(biāo)志的附加輸出尤其隨著Java虛擬機開發(fā)的需要而變化。此處顯示了使用串行垃圾收集器的J2SE平臺1.5版的-XX:+ PrintGCDetails輸出示例。

[GC [DefNew:64575K-> 959K(64576K),0.0457646 secs] 196016K-> 133633K(261184K),0.0459067 secs]]

表明未成年人收集了大約98%的?年輕一代,

DefNew:64575K-> 959K(64576K)

并花了大約46毫秒。

0.0457646秒

整個堆的使用率降低到約51%

196016K-> 133633K(261184K)

并且如最后一次所示,收集(超出年輕一代的收集)有一些額外的開銷?:

0.0459067秒

標(biāo)志-XX:+ PrintGCTimeStamps還將在每個集合的開頭打印時間戳。

111.042:[GC 111.042:[DefNew:8128K-> 8128K(8128K),0.0000505 secs] 111.042:[Tenured:18154K-> 2311K(24576K),0.1290354 secs] 26282K-> 2311K(32704K),0.1293306 secs]

該集合開始執(zhí)行應(yīng)用程序大約111秒。次要收集大約在同一時間開始。此外,還顯示Tenured描繪的主要收藏品的信息。的?終身代使用減少到約10%的

18154K-> 2311K(24576K)

花了大約0.13秒。

0.1290354秒


---------------------

作者:a_Ygygs_Dxdsr_XdMss

來源:CSDN

原文:https://blog.csdn.net/weixin_42749765/article/details/87363823

版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容