溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

troubleshoot中怎么使用JFR分析性能

發(fā)布時間:2021-08-03 14:11:29 來源:億速云 閱讀:145 作者:Leah 欄目:大數(shù)據(jù)

troubleshoot中怎么使用JFR分析性能,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

GC性能事件

一般來說,GC會對java程序的性能操作產(chǎn)生比較重要的影響。我們可以使用jfr監(jiān)控jdk.GCPhasePause事件。

下面是一個jdk.GCPhasePause的例子:

jfr print --events jdk.GCPhasePause flight_recording_1401comflydeanTestMemoryLeak89268.jfr

輸出結(jié)果:

jdk.GCPhasePause {
  startTime = 19:51:49.798
  duration = 41.1 ms
  gcId = 2
  name = "GC Pause"
}

通過GCPhasePause事件,我們可以統(tǒng)計總的GC pause時間和平均每一次GC pause的時間。

一般來說GC是在后臺執(zhí)行的,所以GC本身的執(zhí)行時間我們并不需要關(guān)注,因為這并不會影響到程序的性能。我們需要關(guān)注的是應(yīng)用程序因為GC暫停的時間。

考慮下面兩種情況,第一種單獨的GC導致GC pause時間過長。第二種是總的GC pause時間過長。

如果是第一種情況,那么可能需要考慮換一個GC類型,因為不同的GC類型在pause時間和吞吐量的平衡直接會有不同的處理。同時我們需要減少finalizers的使用。

如果是第二種情況,我們可以從下面幾個方面來解決。

  • 增加heap空間大小。heap空間越大,GC的間隔時間就越長??偟腉C pause時間就會越短。

  • 盡量減少tmp對象的分配。我們知道為了提升多線程的性能,JVM會使用TLAB技術(shù)。一般來說小對象會分配在TLAB中,但如果是大對象,則會直接分配在heap空間中。但是大部分對象都是在TLAB中分配的。所以我們可以同時關(guān)注TLAB和TLAB之外的兩個事件:jdk.ObjectAllocationInNewTLAB和dk.ObjectAllocationOutsideTLAB。

  • 減少分配頻率。我們可以通過jdk.ThreadAllocationStatistics來分析。

同步性能

在多線程環(huán)境中,因為多線程會競爭共享資源,所以對資源的同步,或者鎖的使用都會影響程序的性能。

我們可以監(jiān)控jdk.JavaMonitorWait事件。

jfr print --events jdk.JavaMonitorWait flight_recording_1401comflydeanTestMemoryLeak89268.jfr

我們看一個結(jié)果:

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性能

如果應(yīng)用程序有很多IO操作,那么IO操作也是會影響性能的關(guān)鍵一環(huán)。

我們可以監(jiān)控兩種IO類型:socket IO和File IO。

相對應(yīng)的事件有:dk.SocketWrite,jdk.SocketRead,jdk.FileWrite,jdk.FileRead。

代碼執(zhí)行的性能

代碼是通過CPU來運行的,如果CPU使用過高,也可能會影響到程序的性能。

我們可以通過監(jiān)聽jdk.CPULoad事件來對CPULoad進行分析。

jfr print --events jdk.CPULoad flight_recording_1401comflydeanTestMemoryLeak89268.jfr

看下運行結(jié)果:

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之外,還有一些其他有用的我們可以關(guān)注的event。

比如線程相關(guān)的:jdk.ThreadStart,jdk.ThreadEnd,jdk.ThreadSleep,jdk.ThreadPark。

如果你使用JMC,那么可以很直觀的查看JFR的各種事件。

troubleshoot中怎么使用JFR分析性能

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

jfr
AI