JVM GC調(diào)優(yōu)入門

JVM GC調(diào)優(yōu)入門

這篇文章會介紹幾個常用的調(diào)優(yōu)參數(shù),再通過兩個案例介紹如何進行JVM GC調(diào)優(yōu)。閱讀這篇文章的前提是假設大家已經(jīng)對JVM內(nèi)存模型、JVM的垃圾回收算法益楼、JVM的垃圾回收器都比較熟悉了。

JVM調(diào)優(yōu)是必須的嗎点晴?

閱讀下面的內(nèi)容之前首先拋出這個問題:GC調(diào)優(yōu)對于java服務是必須的嗎感凤?實際上,我感覺80%的java的程序員在實際工作中都沒有碰到過GC調(diào)優(yōu)吧粒督,這是因為多數(shù)的Java應用不需要在服務器上進行GC優(yōu)化俊扭,多數(shù)導致GC問題的Java應用,都不是因為我們參數(shù)設置錯誤坠陈,而是代碼問題萨惑,需要記住一點:GC調(diào)優(yōu)是最后要做的工作

GC調(diào)優(yōu)的目的可以總結(jié)為下面兩點:

  • 減少對象晉升到老年代的數(shù)量
  • 減少FullGC的執(zhí)行時間

減少對象晉升到老年代的數(shù)量

分代垃圾回收是Oracle JVM中回收思想仇矾。 我們知道在Eden區(qū)創(chuàng)建的對象庸蔼,在from Survivor 復制到to Survivor區(qū)之后,達到一定年齡就進入了老年代贮匕。有些對象因為比較大就直接進入了老年代姐仅。在老年代的GC時間相比于年輕代時間更長。因此刻盐,減少對象進入老年代可以降低Full GC的頻率

減少FullGC的執(zhí)行時間

Full GC的時間比Minor GC要長掏膏。所以如果執(zhí)行太長時間的Full GC(超過1秒),就會發(fā)生超時錯誤

  • 如果你試著減少老年代的大小來降低Full GC的執(zhí)行時間敦锌,可能會引發(fā)OutOfMemoryError或者導致Full GC的頻率升高馒疹。
  • 如果是通過增加老年代的大小來降低Full GC的頻率,執(zhí)行時間將會增加乙墙。

影響GC的參數(shù)

JVM調(diào)優(yōu)主要用到參數(shù)羅列在下面的兩張表中颖变。主要分為內(nèi)存參數(shù)和垃圾類型參數(shù)。GC優(yōu)化的過程就是在調(diào)試這些參數(shù)的過程听想。

下表是與JVM內(nèi)存相關的參數(shù):


image.png

比較常用的參數(shù)是 -Xms, -Xmx-XX:NewRatio

下表展示的垃圾收集器類型的可選參數(shù):


image.png

不同的垃圾回收器與老年代年輕代的關系如下:


image.png

還有一個常用的參數(shù)是-XX:+PrintGCDetails
通過 -XX:+PrintGCDetails可以查看具體的GC日志腥刹。下面的兩張圖分別介紹Full GC與Minor GC日志里的各個字段。

image.png

image.png

監(jiān)控命令

設置好上面將的參數(shù)后汉买,可以通過監(jiān)控查看我們優(yōu)化的衔峰。監(jiān)控可以分為命令監(jiān)控圖形化監(jiān)控。關于圖形化監(jiān)控可用工具比較常見的有JConsole和VisualVM,可以參考這篇文章垫卤。這里不做過多介紹邻吞。這節(jié)主要介紹個常用的監(jiān)控命令,在下面的案例中也是有用到的葫男。

jps 命令格式:jps [option] [hostid]
jps命令用于查詢正在運行的JVM進程,常用的參數(shù)為:
-q:只輸出LVMID崔列,省略主類的名稱
-m:輸出虛擬機進程啟動時傳給主類main()函數(shù)的參數(shù)
-l:輸出主類的全類名梢褐,如果進程執(zhí)行的是Jar包,輸出Jar路徑
-v:輸出虛擬機進程啟動時JVM參數(shù)

例子:


image.png

jstack 命令格式:jstack [option] vmid
用于生成當前JVM的所有線程快照赵讯,線程快照是虛擬機每一條線程正在執(zhí)行的方法,目的是定位線程出現(xiàn)長時間停頓的原因盈咳。
-F:當正常輸出的請求不被響應時,強制輸出線程堆棧
-l:除堆棧外边翼,顯示關于鎖的附加信息
-m:如果調(diào)用到本地方法的話鱼响,可以顯示C/C++的堆棧

例子


image.png

jmap 命令格式:jmap [option] vmid
用于顯示當前Java堆和永久代的詳細信息(如當前使用的收集器,當前的空間使用率等)
-dump:生成java堆轉(zhuǎn)儲快照
-heap:顯示java堆詳細信息(只在Linux/Solaris下有效)
-F:當虛擬機進程對-dump選項沒有響應時组底,可使用這個選項強制生成dump快照(只在Linux/Solaris下有效)
-histo:顯示堆中對象統(tǒng)計信息

例子


image.png

jstat命令格式:jstat [option vmid [interval[s|ms] [count]]]
jstat可以實時顯示本地或遠程JVM進程中類裝載丈积、內(nèi)存、垃圾收集债鸡、JIT編譯等數(shù)據(jù)
-class:監(jiān)視類裝載江滨、卸載數(shù)量、總空間及類裝載所耗費的時間
-gc:監(jiān)聽Java堆狀況厌均,包括Eden區(qū)唬滑、兩個Survivor區(qū)、老年代棺弊、永久代等的容量晶密,以用空間、GC時間合計等信息
-gccapacity:監(jiān)視內(nèi)容與-gc基本相同模她,但輸出主要關注java堆各個區(qū)域使用到的最大和最小空間
-gcutil:監(jiān)視內(nèi)容與-gc基本相同稻艰,但輸出主要關注已使用空間占總空間的百分比
-gccause:與-gcutil功能一樣,但是會額外輸出導致上一次GC產(chǎn)生的原因
-gcnew:監(jiān)視新生代GC狀況
-gcnewcapacity:監(jiān)視內(nèi)同與-gcnew基本相同侈净,輸出主要關注使用到的最大和最小空間
-gcold:監(jiān)視老年代GC情況
-gcoldcapacity:監(jiān)視內(nèi)同與-gcold基本相同连锯,輸出主要關注使用到的最大和最小空間
-gcpermcapacity:輸出永久代使用到最大和最小空間
-compiler:輸出JIT編譯器編譯過的方法、耗時等信息

例子


image.png

命令jstat -gc 309 1000 5代表著:搜集vid為309的java進程的整體gc狀態(tài)用狱, 每1000ms收集一次运怖,共收集5次

案例

下面兩個案例是網(wǎng)友的JVM調(diào)優(yōu)過程,作者過程思路清晰夏伊,步步分析到位摇展,在這里分享給大家:
1、CMS調(diào)優(yōu)
2溺忧、OOM問題調(diào)優(yōu)

總結(jié)

JVM調(diào)優(yōu)在實際工作中用到的比較少咏连,但是這也是作為java程序員必須掌握的基本技能盯孙。真正熟練的使用GC調(diào)優(yōu),是建立在多次進行GC監(jiān)控和調(diào)優(yōu)的實戰(zhàn)經(jīng)驗上的祟滴。

下面羅列了幾個數(shù)據(jù)作為參考振惰,如果GC執(zhí)行時間滿足下列所有條件,就沒有必要進行GC優(yōu)化了:

Minor GC執(zhí)行非常迅速(50ms以內(nèi))

Minor GC沒有頻繁執(zhí)行(大約10s執(zhí)行一次)

Full GC執(zhí)行非常迅速(1s以內(nèi))

Full GC沒有頻繁執(zhí)行(大約10min執(zhí)行一次)


PS:如果你要應付面試上的JVM題目垄懂。這可以參考這篇文章jvm知識點總覽

參考文章:How to Tune Java Garbage Collection

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骑晶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子草慧,更是在濱河造成了極大的恐慌桶蛔,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漫谷,死亡現(xiàn)場離奇詭異仔雷,居然都是意外死亡,警方通過查閱死者的電腦和手機舔示,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門碟婆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惕稻,你說我怎么就攤上這事脑融。” “怎么了缩宜?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵肘迎,是天一觀的道長。 經(jīng)常有香客問我锻煌,道長妓布,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任宋梧,我火速辦了婚禮匣沼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捂龄。我一直安慰自己释涛,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布倦沧。 她就那樣靜靜地躺著唇撬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪展融。 梳的紋絲不亂的頭發(fā)上窖认,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音,去河邊找鬼扑浸。 笑死烧给,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的喝噪。 我是一名探鬼主播础嫡,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼酝惧!你這毒婦竟也來了榴鼎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤系奉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后姑廉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缺亮,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年桥言,在試婚紗的時候發(fā)現(xiàn)自己被綠了萌踱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡号阿,死狀恐怖并鸵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扔涧,我是刑警寧澤园担,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站枯夜,受9級特大地震影響弯汰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜湖雹,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一咏闪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摔吏,春花似錦鸽嫂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至诗箍,卻和暖如春哗脖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工才避, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留橱夭,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓桑逝,卻偏偏與公主長得像棘劣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子楞遏,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容