參考地址1
參考地址2
最近做性能測試, 無法定位到問題, 故使用內(nèi)置的Java飛行記錄器:Java Mission Control
.
一. 開啟流程如下:
在Linux服務(wù)器上:
1. 要檢查的服務(wù)的JDK要求:
- JDK是1.8u44以上. 不需要配置參數(shù);
- JDK是1.8以下, 需要配置: -XX:+UnlockCommercialFeatures -XX:+FlightRecorder
2. 啟動(dòng)服務(wù).
3. 開啟飛行記錄.
jcmd <pid> JFR.start delay=10s duration=15m filename=log.jfr
說明:
- pid: 服務(wù)的進(jìn)程號. 使用ps -ef | grep java 查詢. (使用時(shí)去除尖括號)
- delay: 延遲開啟配置. delay=10s 代表延遲10秒開啟.
- duration: 指收集的日志時(shí)長. duration=15m, 代表收集15分鐘的JVM信息.
- filename: 指將收集的日志存在指定的日志文件中. filename=log.jfr, 代表將收集的日志存放在log.jfr中.
二. JFR(Java Flight Recorder)
如何查看飛行記錄? 下面展示如何查看飛行記錄:
1. 常規(guī)選項(xiàng)卡
“常規(guī)”選項(xiàng)卡包含一些描述常規(guī)應(yīng)用程序的子選項(xiàng)卡惰爬,第一個(gè)子選項(xiàng)卡是Overview谎柄,它顯示了一些基本信息尚辑,如堆最大使用率,總CPU使用率和GC暫停時(shí)間糊余,如圖2-9 所示:
另外蚀乔,查看一段時(shí)間內(nèi)的CPU使用情況蒋纬,以及應(yīng)用程序使用情況和機(jī)器總數(shù)泊愧,當(dāng)應(yīng)用程序中出現(xiàn)問題時(shí),此選項(xiàng)卡就變得很有用官套。例如酒奶,關(guān)注CPU使用率接近100%或CPU使用率過低,過長的垃圾收集暫停時(shí)間奶赔。
其他子選項(xiàng)卡
- JVM Information顯示JVM信息惋嚎。啟動(dòng)參數(shù).
- “ 系統(tǒng)屬性”,顯示所有系統(tǒng)屬性設(shè)置.
- “ 記錄”顯示有關(guān)特定記錄的信息站刑,例如:打開的事件另伍。單擊問號以獲取有關(guān)所有選項(xiàng)卡和子選項(xiàng)卡的內(nèi)置詳細(xì)信息。
2. 內(nèi)存選項(xiàng)卡
“內(nèi)存”選項(xiàng)卡包含有垃圾收集绞旅、分配模式和對象統(tǒng)計(jì)信息摆尝,此選項(xiàng)卡有助于調(diào)試內(nèi)存泄漏及調(diào)整GC。圖2-10檢查飛行記錄 - 垃圾收集
如圖2所示因悲,堆使用的尖峰模式完全正常堕汞。在大多數(shù)應(yīng)用程序中,始終分配臨時(shí)對象晃琳,滿足條件后讯检,將觸發(fā)垃圾收集(GC)并刪除不再使用的對象琐鲁。因此,堆使用量會(huì)穩(wěn)定增加人灼,直到GC被觸發(fā)围段,然后突然下降。
Java中的大多數(shù)GC都有一些較小的垃圾收集投放,old GC遍歷整個(gè)Java堆奈泪,而另一個(gè)GC可能會(huì)查看堆的一部分,old GC后的堆使用情況跪呈,是應(yīng)用程序正在使用的內(nèi)存段磨。
啟用堆統(tǒng)計(jì)信息生成的飛行記錄取逾,將以old GC開始和結(jié)束耗绿。在GCs列表中選擇old GC,然后砾隅,選擇General選項(xiàng)卡误阻,以查看GC原因——堆檢查啟動(dòng)GC。這些GC通常比其他GC要稍長一些晴埂。為了更好地處理內(nèi)存泄漏究反,請查看第一個(gè)和最后一個(gè)old GC之后的堆。當(dāng)這個(gè)值隨時(shí)間增加時(shí)儒洛,可能存在內(nèi)存泄漏精耐。
“GC時(shí)間”選項(xiàng)卡包含有關(guān)執(zhí)行GC所花費(fèi)的時(shí)間,以及應(yīng)用程序因GC而完全暫停的時(shí)間信息琅锻。該GC配置選項(xiàng)卡有GC的配置信息卦停。有關(guān)這些選項(xiàng)卡的更多詳細(xì)信息,請單擊右上角的問號以查看內(nèi)置幫助恼蓬。
分配選項(xiàng)卡: 圖3顯示了內(nèi)存分配選項(xiàng)惊完,Java中的小對象在TLAB(線程局部區(qū)域緩沖區(qū))中分配。TLAB是一個(gè)分配新對象的小內(nèi)存區(qū)域处硬。一旦TLAB滿了小槐,線程就會(huì)創(chuàng)建一個(gè)新的,所有觸發(fā)新TLAB的分配都被記錄下來荷辕。在TLAB之外分配較大的對象凿跳,這些對象也被記錄下來。圖3檢查飛行記錄 - 分配選項(xiàng)卡
要估計(jì)每個(gè)類的內(nèi)存分配疮方,在“新TLAB”選項(xiàng)卡中選擇“分配”控嗜,然后,選擇“分配”選項(xiàng)卡案站。這些分配是碰巧觸發(fā)新TLAB的對象分配躬审,char數(shù)組引發(fā)了最多的新TLABs棘街,分配多少內(nèi)存作為char數(shù)組是未知的,TLAB的大小是對char數(shù)組內(nèi)存分配的估計(jì)承边。
圖3是char數(shù)組的最大內(nèi)存分配示例遭殉,單擊其中一個(gè)類,以查看這些分配的堆棧跟蹤博助。示例記錄顯示险污,44%的分配壓力來自char數(shù)組,27%來自Array.copyOfRange富岳,StringBuilder.toString依次調(diào)用Throwable.printStackTrace和StackTraceElement.toString蛔糯,展開進(jìn)一步以了解這些方法是如何調(diào)用的。
注意:應(yīng)用程序分配的臨時(shí)對象越多窖式,應(yīng)用程序必須垃圾回收的越多蚁飒。“分配”選項(xiàng)卡可幫助找到最多的分配萝喘,并降低應(yīng)用程序中的GC壓力淮逻。查看TLAB選項(xiàng)卡外的Allocation,以查看大內(nèi)存分配阁簸,這通常比New TLAB選項(xiàng)卡中的分配爬早,具有更少的內(nèi)存壓力。
“對象統(tǒng)計(jì)”選項(xiàng)卡
“對象統(tǒng)計(jì)”選項(xiàng)卡顯示實(shí)時(shí)收集最多的類启妹。從Memory選項(xiàng)卡中讀取Garbage Collection子選項(xiàng)卡以了解實(shí)時(shí)GC筛严。圖3顯示了用于飛行記錄的堆統(tǒng)計(jì)信息。啟用飛行記錄的堆統(tǒng)計(jì)信息以顯示數(shù)據(jù)饶米,底部的“Top Growers”選項(xiàng)卡桨啃,顯示了在飛行記錄期間每種對象的增加情況,特定類型對象的數(shù)量增加咙崎,通常表示存在內(nèi)存泄漏优幸,但一個(gè)小的變化是正常的,特別是褪猛,研究非標(biāo)準(zhǔn)的Java類的top growers网杆。
代碼選項(xiàng)卡
Code選項(xiàng)卡包含有關(guān)應(yīng)用程序,在何處花費(fèi)大部分時(shí)間的信息伊滋,在概述子選項(xiàng)卡顯示碳却,花費(fèi)最多執(zhí)行時(shí)間的包和類。這些數(shù)據(jù)來自抽樣笑旺,JFR采用間隔運(yùn)行的線程樣本昼浦。只對實(shí)際運(yùn)行代碼的線程進(jìn)行抽樣,不會(huì)顯示正在休眠筒主、等待鎖或I/O的線程关噪。要了解應(yīng)用程序時(shí)間的更多詳細(xì)信息鸟蟹,可以查看Hot Methods子選項(xiàng)卡。
圖5顯示了采樣次數(shù)最多的方法使兔,展開這些示例建钥,以查看調(diào)用它們的位置。如果一個(gè)HashMap.getEntry調(diào)用很多虐沥,然后展開這個(gè)節(jié)點(diǎn)熊经,直到找到調(diào)用最多的方法。這是用于查找應(yīng)用程序瓶頸的最佳選項(xiàng)卡欲险。
“Call Tree”子選項(xiàng)卡:顯示相同的事件镐依,但從底部開始,例如天试,來自Thread.run槐壳。
Exceptions子選項(xiàng)卡:顯示發(fā)生的異常,默認(rèn)情況下秋秤,只記錄錯(cuò)誤宏粤,但在啟動(dòng)新記錄時(shí)更改此設(shè)置以包含所有異常。
Compilations子選項(xiàng)卡:顯示應(yīng)用程序運(yùn)行時(shí)實(shí)時(shí)編譯的方法灼卢。
Class Loading選項(xiàng)卡:顯示已加載的類的數(shù)量、實(shí)際加載的類和隨時(shí)間推移的卸載類来农,此子選項(xiàng)卡僅包含在錄制開始時(shí)鞋真,啟用“Class Loading”事件時(shí)所顯示的信息。
有關(guān)這些選項(xiàng)卡的更多詳細(xì)信息沃于,請單擊右上角的問號以查看內(nèi)置幫助涩咖。
線程選項(xiàng)卡
“線程”選項(xiàng)卡包含有關(guān)線程,鎖爭用和其他延遲的信息繁莹。
Overview 子選項(xiàng)卡:顯示了CPU的使用情況和隨著時(shí)間推移的線程數(shù)量檩互。
Hot Threads子選項(xiàng)卡:顯示執(zhí)行大部分代碼的線程,此信息與Code選項(xiàng)卡中的Hot Methods子選項(xiàng)卡使用相同的抽樣數(shù)據(jù)咨演。Contention爭用標(biāo)簽對于找到瓶頸非常有用闸昨。
圖6顯示了由于同步而最等待的對象。選擇一個(gè)Class以查看每個(gè)對象的等待時(shí)間的堆棧跟蹤薄风,這些暫停通常由同步方法引起饵较。注意:默認(rèn)情況下,僅記錄長度超過10毫秒的同步事件遭赂,但可以在開始錄制時(shí)設(shè)置此閾值循诉。
Latencies 子選項(xiàng)卡:顯示其他延遲源,例如撇他,調(diào)用sleep或wait茄猫、從socket讀取或等待文件I/O狈蚤。
Thread Dumps 子選項(xiàng)卡:顯示可以在記錄中觸發(fā)的周期性線程轉(zhuǎn)儲。
Lock Instances 子選項(xiàng)卡:顯示由于同步而等待最多的對象划纽。
有關(guān)這些選項(xiàng)卡的更多詳細(xì)信息炫惩,單擊右上角的問號以查看內(nèi)置幫助。
I/O選項(xiàng)卡
在I/O選項(xiàng)卡中顯示了文件讀取阿浓,文件寫入他嚷,socket讀取,socket寫入信息芭毙。這個(gè)選項(xiàng)卡根據(jù)應(yīng)用程序的不同而有所幫助筋蓖,特別是I/O操作時(shí)間很長時(shí)。
注意:認(rèn)情況下退敦,只顯示大于10毫秒的事件粘咖,在創(chuàng)建新記錄時(shí)可以修改閾值。
系統(tǒng)選項(xiàng)卡
“System”選項(xiàng)卡:提供有關(guān)運(yùn)行應(yīng)用程序的計(jì)算機(jī)的CPU侈百,內(nèi)存和操作系統(tǒng)的詳細(xì)信息瓮下。它還顯示環(huán)境變量,以及與JVM同時(shí)運(yùn)行的其他進(jìn)程钝域。
事件選項(xiàng)卡
“Events”選項(xiàng)卡:顯示錄制中的所有事件讽坏,這是一個(gè)高級選項(xiàng)卡,能夠以多種方式使用例证。有關(guān)這些選項(xiàng)卡的更多詳細(xì)信息路呜,單擊右上角的問號以查看內(nèi)置幫助。