Java GC優(yōu)化速查表
her0kings1ey
本文是基于Java Performance The Definitive Guide書中的優(yōu)化GC章節(jié)最后的Summary部分作的總結(jié)椅野。在閱讀了英文版后回还,覺得還是翻譯概括一下,以便日后的速查氧秘。
GC優(yōu)化步驟
1 你的應用能容忍full gc帶來的全局暫停么情臭?
如果可以省撑,那么選擇Throughput collector吧,它在使用較少的CPU時間和堆空間的同時提供較好的性能俯在;否則竟秫,選擇并發(fā)收集器,堆空間較小的話CMS和G1都可以跷乐,比較大的堆空間的話最好使用G1吧肥败。
2 默認的GC設置一般就足夠滿足性能要求了
如果覺得性能有問題需要優(yōu)化GC,先確認性能瓶頸是在GC上愕提。分析GC日志馒稍,看下具體GC花了多少時間以及它的頻度。如果GC的時間小于3%揪荣,其實不太必要優(yōu)化(除非你是要優(yōu)化整體響應時間筷黔,如99%響應時間)
3 當前的GC暫停應用時間和你的目標接近么?
如果接近仗颈,只需要調(diào)整最大暫停時間可能就ok了佛舱。如果暫停時間離你的要求還很遠挨决,但應用的吞吐量還符合你的預期,你可以減小新生代的大小肆捕。不過盖高,這樣會導致更多但更小的暫停喻奥。
4 吞吐量是否是瓶頸?
那么你需要增加堆空間大腥筇荨(或者至少增加新生代的大蟹拿)
但有時候更多不意味著更好:更大的堆同時意味著更長的暫停時間。即便是并發(fā)收集器扫倡,也意味著更長的新生代回收時間顿痪。這是因為更大的堆就會有更大的新生代蚁袭,也就意味著更長的回收時間。
5 你正在使用并發(fā)收集器么卖哎,有遇到并發(fā)模式回收失敗么删性?
如果你有足夠的CPU蹬挺,嘗試增加后臺并發(fā)GC的線程數(shù),又或者通過調(diào)整InitiatingHeapOccupancyPercent來更早地啟動后臺的并發(fā)回收溯泣。對于G1算法來說垃沦,如果還有剩余的mixedGC 沒有完成用押,并發(fā)模式不會啟動蜻拨。對于這種情況,嘗試減少mixed GC count來加快全部mixed GC的完成纵菌。
你正在使用并發(fā)收集器么,有遇到因為提升到老生帶失敗導致的full GC么功氨?
對于CMS收集器來說捷凄,提升失敗暗示內(nèi)存存在碎片化。我們能做得很少匈睁,某些情況下可以嘗試使用更大的堆或者更早地啟動后臺回收線程航唆,但不總是有效院刁。對于這種情況,更好的解決方案是使用G1收集器任岸。對于G1收集器享潜,同樣存在這種情況嗅蔬,但是可以通過更早地啟動后臺回收線程以及加快mixedGC進度购城。這樣G1會在后臺線程回收的過程中對內(nèi)存進行壓縮瘪板,集中到某些塊中,減少碎片化的情況锣枝。
以上是該章的summary兰英,實際上還有很多具體的情形沒有說到畦贸。另外對于一些概念楞捂,如young gc寨闹、old gc繁堡、full gc的概念沒有陳述清楚乡数,后面希望有時間能對這一塊進行總結(jié)吧净赴。