您好,登錄后才能下訂單哦!
本文翻譯自:https://www.redhat.com/en/blog/collecting-and-reading-g1-garbage-collector-logs-part-2?source=author&term=22991
這篇文章將深入研究G1的日志和調優參數。為了在實際工作中對G1進行調優,作為開發者的你需要理解G1垃圾收集器的每個步驟,以及每個步驟在整個垃圾收集周期中的作用。為了方便讀者學習,這篇文章將G1的日志參數分為等級遞增的三塊,這篇文章將會分別介紹每一部分參數的作用和調優時候使用的場景。
如果你要在生產環境中使用G1 GC,下面這些跟日志相關的參數是必備的,有了這些參數,你才能排查基本的垃圾回收問題。
使用-XX:GCLogFileSize
設置合適的GC日志文件大小,使用-XX:NumberOfGCLogFiles
設置要保留的GC日志文件個數,使用-Xloggc:/path/to/gc.log
設置GC日志文件的位置,通過上面三個參數保留應用在運行過程中的GC日志信息,我建議最少保留一個星期的GC日志,這樣應用的運行時信息足夠多的,方便排查問題。
和其他垃圾收集器一樣,G1也使用-XX:PrintGCDetails
打印出詳細的垃圾收集日志,下面這張圖是新生代收集的標準流程,我在這里將它分成了6個步驟:
-XX:+PrintGCDateStamps
參數可以打印出這個時間;-XX:ParallelGCThreads
設置,這個參數的值的設置,跟CPU有關,如果物理CPU支持的線程個數小于8,則最多設置為8;如果物理CPU支持的線程個數大于8,則默認值為number * 5/8G1ReclaimDeadHumongousObjectsAtYoungGC
設置,默認為true。G1的第二種收集活動是并發垃圾收集,并發垃圾收集的觸發條件有很多,但是做的工作都相同,它的日志如下圖所示:
-XX:ConcGCThreads
設置;(2)trace整個堆,并使用位圖標記所有存活的對象,因為在top TAMS之前的對象是隱式存活的,所以這里只需要標記出那些在top TAMS之后、閾值之前的;(3)記錄在并發標記階段的變更,G1這里使用了SATB算法,該算法要求在垃圾收集開始的時候給堆做一個快照,在垃圾收集過程中這個快照是不變的,但實際上肯定有些對象的引用會發生變化,這時候G1使用了pre-write barrier記錄這種變更,并將這個記錄存放在一個SATB緩沖區中,如果該緩沖區滿了就會將它加入到一個全局的緩沖區,同時G1有一個線程在并行得處理這個全局緩沖區;(4)在并發標記過程中,會記錄每個分區的存活對象占整個分區的大小的比率;清理階段,也會Stop the World
在并發收集階段結束后,你會看到混合收集階段的日志,如下圖所示,該日志的大部分跟之前討論的新生代收集相同,只有第1部分不一樣:GC pause(G1 Evacuation Pause)(mixed),0.0129474s,這一行表示這是一個混合垃圾收集周期;在混合垃圾收集處理的CSet不僅包括新生代的分區,還包括老年代分區——也就是并發標記階段標記出來的那些老年代分區。
如果堆內存空間不足以分配新的對象,或者是Metasapce空間使用率達到了設定的閾值,那么就會觸發Full GC——你在使用G1的時候應該盡量避免這種情況發生,因為G1的Full Gc是單線程、會Stop The World,代價非常高。Full GC的日志如下圖所示,從中你可以看出三類信息
基礎配置參數中,我這里還想介紹兩個:-XX:+PrintGCApplicationStoppedTime
和-XX:+PrintGCApplicationConcurrentTime
,這兩個參數也可以為你提供有用的信息,如下圖所示:
這篇文章只是翻譯了原文的第一部分,基礎參數篇,我接下來會有一篇或兩篇文章完成原文的高級參數和Debug參數兩部分。------
本號專注于后端技術、JVM問題排查和優化、Java面試題、個人成長和自我管理等主題,為讀者提供一線開發者的工作和成長經驗,期待你能在這里有所收獲。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。