您好,登錄后才能下訂單哦!
troubleshoot中怎么使用JFR分析性能,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
一般來說,GC會對java程序的性能操作產生比較重要的影響。我們可以使用jfr監控jdk.GCPhasePause事件。
下面是一個jdk.GCPhasePause的例子:
jfr print --events jdk.GCPhasePause flight_recording_1401comflydeanTestMemoryLeak89268.jfr
輸出結果:
jdk.GCPhasePause { startTime = 19:51:49.798 duration = 41.1 ms gcId = 2 name = "GC Pause" }
通過GCPhasePause事件,我們可以統計總的GC pause時間和平均每一次GC pause的時間。
一般來說GC是在后臺執行的,所以GC本身的執行時間我們并不需要關注,因為這并不會影響到程序的性能。我們需要關注的是應用程序因為GC暫停的時間。
考慮下面兩種情況,第一種單獨的GC導致GC pause時間過長。第二種是總的GC pause時間過長。
如果是第一種情況,那么可能需要考慮換一個GC類型,因為不同的GC類型在pause時間和吞吐量的平衡直接會有不同的處理。同時我們需要減少finalizers的使用。
如果是第二種情況,我們可以從下面幾個方面來解決。
增加heap空間大小。heap空間越大,GC的間隔時間就越長。總的GC pause時間就會越短。
盡量減少tmp對象的分配。我們知道為了提升多線程的性能,JVM會使用TLAB技術。一般來說小對象會分配在TLAB中,但如果是大對象,則會直接分配在heap空間中。但是大部分對象都是在TLAB中分配的。所以我們可以同時關注TLAB和TLAB之外的兩個事件:jdk.ObjectAllocationInNewTLAB和dk.ObjectAllocationOutsideTLAB。
減少分配頻率。我們可以通過jdk.ThreadAllocationStatistics來分析。
在多線程環境中,因為多線程會競爭共享資源,所以對資源的同步,或者鎖的使用都會影響程序的性能。
我們可以監控jdk.JavaMonitorWait事件。
jfr print --events jdk.JavaMonitorWait flight_recording_1401comflydeanTestMemoryLeak89268.jfr
我們看一個結果:
jdk.JavaMonitorWait { startTime = 19:51:25.395 duration = 2 m 0 s monitorClass = java.util.TaskQueue (classLoader = bootstrap) notifier = N/A timeout = 2 m 0 s timedOut = true address = 0x7FFBB7007F08 eventThread = "JFR Recording Scheduler" (javaThreadId = 17) stackTrace = [ java.lang.Object.wait(long) java.util.TimerThread.mainLoop() line: 553 java.util.TimerThread.run() line: 506 ] }
通過分析JavaMonitorWait事件,我們可以找到競爭最激烈的鎖,從而進行更深層次的分析。
如果應用程序有很多IO操作,那么IO操作也是會影響性能的關鍵一環。
我們可以監控兩種IO類型:socket IO和File IO。
相對應的事件有:dk.SocketWrite,jdk.SocketRead,jdk.FileWrite,jdk.FileRead。
代碼是通過CPU來運行的,如果CPU使用過高,也可能會影響到程序的性能。
我們可以通過監聽jdk.CPULoad事件來對CPULoad進行分析。
jfr print --events jdk.CPULoad flight_recording_1401comflydeanTestMemoryLeak89268.jfr
看下運行結果:
jdk.CPULoad { startTime = 19:53:25.519 jvmUser = 0.63% jvmSystem = 0.37% machineTotal = 20.54% }
如果jvm使用的cpu比較少,但是整個machine的CPU使用率比較高,這說明了有其他的程序在占用CPU。
如果JVM自己的CPU使用就很高的話,那么就需要找到這個占用CPU的線程進行進一步分析。
除了上面提到的event之外,還有一些其他有用的我們可以關注的event。
比如線程相關的:jdk.ThreadStart,jdk.ThreadEnd,jdk.ThreadSleep,jdk.ThreadPark。
如果你使用JMC,那么可以很直觀的查看JFR的各種事件。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。