什么是分配率?
諸如“不可持續的分配率”和“您需要保持較低的分配率”等短語似乎僅屬于Java Champions的詞匯表。 復雜,恐怖并被魔術光環包圍。
經常發生的情況是,當您更仔細地查看概念時,魔術會隨著抽煙消失。 這篇文章試圖從提到的條款中刪除魔術。
什么是分配率?我為什么要關心?
分配率以每個時間單位分配的內存量來衡量。 通常以MB /秒表示,但如果您愿意,可以每年使用PB。 這就是全部,沒有魔術,只是您在一段時間內在Java代碼中分配的內存量。
但是,僅了解這一事實并不太有益。 如果您可以忍受我,我將指導您實際使用該概念。
面對高分配率可能會給您的應用程序性能帶來麻煩。 從實際的角度來看, 垃圾收集已成為瓶頸,從而浮出水面。 從硬件的角度來看,即使是商用硬件,每個內核也可以維持數GB /秒的分配,因此,如果您的速率開始不超過1 GB /秒/核,您可以放心,您的硬件實際上不會成為瓶頸。
因此,在關注GC時,我們可以從一個在現實世界中也適用的類比開始-如果您創建很多東西,那么之后往往會面臨很多清理工作。 知道JVM是使用垃圾收集機制構建的,因此需要研究分配速率如何更改GC暫停的頻率或持續時間。
衡量分配率
讓我們從分配率的測量開始。 為此,我們通過為JVM指定-XX:+ PrintGCDetails -XX:+ PrintGCTimeStamps標志來打開GC日志記錄。 JVM現在以與以下代碼段類似的方式開始記錄GC暫停:
0.291: [GC (Allocation Failure) [PSYoungGen: 33280K->5088K(38400K)] 33280K->24360K(125952K), 0.0365286 secs] [Times: user=0.11 sys=0.02, real=0.04 secs] 0.446: [GC (Allocation Failure) [PSYoungGen: 38368K->5120K(71680K)] 57640K->46240K(159232K), 0.0456796 secs] [Times: user=0.15 sys=0.02, real=0.04 secs] 0.829: [GC (Allocation Failure) [PSYoungGen: 71680K->5120K(71680K)] 112800K->81912K(159232K), 0.0861795 secs] [Times: user=0.23 sys=0.03, real=0.09 secs]從上面的GC日志中, 我們可以將分配率計算為上一個收集完成后和下一個收集開始之前的年輕代大小之間的差。 使用上面的示例,我們可以例如提取以下信息:
- JVM啟動后的291 ms ,創建了33,280K 個對象。 第一次小型GC事件清除了Young一代,此后,Young一代還剩下5,088K個對象。
- 發射后446毫秒,Young gen占用已增加到38,368 K, 觸發了下一個GC,從而將Young Gen的占用減少到了5,120K 。
- 發射后829毫秒,Young gen大小為71,680K ,GC再次將其減小至5,120K 。
然后可以在下表中表示此數據,將分配率計算為年輕入住率的增量:
| 第一GC | 291ms | 33,280KB | 5,088KB | 33,280KB | 114MB /秒 |
| 第二GC | 446毫秒 | 38,368KB | 5,120KB | 33,280KB | 215MB /秒 |
| 第三GC | 829毫秒 | 71,680KB | 5,120KB | 66,560KB | 174MB /秒 |
| 總 | 829毫秒 | 不適用 | 不適用 | 133,120KB | 161MB /秒 |
有了這些信息,我們可以說該特定軟件在測量期間的分配速率為161 MB /秒。
分析影響
現在,有了這些信息,我們就可以了解分配速率的變化如何通過增加或減少GC暫停的頻率來影響應用程序吞吐量。 首先,您應該注意到只有Minor GC暫停清潔Young Generation會受到影響。 GC清理舊一代的頻率或持續時間不受分配率的直接影響,而受晉升率的直接影響, 晉升率將在下一篇文章中介紹。
知道我們只能專注于次要GC暫停時,我們接下來應該研究Young Generation內部的不同內存池。 當分配在Eden中進行時 ,我們可以立即查看Eden的大小如何影響分配率。 因此,我們可以有一個假設,即增加Eden的大小將減少較小的GC暫停頻率,從而使應用程序能夠維持更快的分配速率。
實際上,當使用-XX:NewSize -XX:MaxNewSize和-XX:SurvivorRatio參數運行具有不同Eden大小的相同示例時,我們可以看到分配率有兩倍的差異
- 以100M的Eden運行上述示例,將分配速率降低到100MB / sec以下
- 將Eden大小增加到1GB,可以將分配速率增加到剛好低于200MB /秒。
如果您仍然想知道為什么這是正確的- 如果您不常停止GC的應用程序線程,則可以做更多有用的工作。 還發生了更多有用的工作來創建更多對象,從而支持增加的分配率 。
現在,在得出“更大的伊甸園更好”的結論之前,您應該注意到分配率可能并且可能與應用程序的實際吞吐量沒有直接關系。 這是一項技術指標,有助于提高吞吐量。 分配速率可能會并且會影響您的次要GC暫停停止應用程序線程的頻率,但是要查看整體影響,您還需要考慮主要GC暫停并以應用程序的業務操作(不是MB / sec)來衡量吞吐量。提供。
翻譯自: https://www.javacodegeeks.com/2015/09/what-is-allocation-rate.html
總結
- 上一篇: spring mvc拦截器_Spring
- 下一篇: 老挝的首都(带你看看真实的老挝首都现状)