使用async-profiler進行JVM記憶體效能微調的指南 | Baeldung

banq發表於2020-09-27

通常Java Profiler取樣探測器使用JVM工具介面(JVMTI)設計,並在安全點收集堆疊跟蹤。但是這些取樣分析器可能會遇到安全點偏差問題
為了全面瞭解該應用程式,我們需要一個不需要執行緒位於安全點的取樣探查器,並且可以隨時收集堆疊跟蹤資訊以避免安全點偏差問題。
在本教程中,我們將探討async-profiler及其提供的各種配置技術。
 
async-profiler是用於任何基於HotSpot JVM的 JDK的取樣分析器。它具有較低的開銷,並且不依賴JVMTI。
透過使用HotSpot JVM提供的AsyncGetCallTrace API來分析Java程式碼路徑,並使用Linux的perf_events來分析本機程式碼路徑,可以避免安全點偏差問題。
換句話說,分析器將Java程式碼和本機程式碼路徑的呼叫堆疊進行匹配,以產生準確的結果。
 
首先,我們將基於我們的平臺下載最新版本的async-profiler。當前,它僅支援Linux和macOS平臺。
下載後,我們可以檢查它是否在我們的平臺上正常工作:

$ ./profiler.sh --version

 
其次,在Linux平臺上使用async-profiler時,我們應確保配置核心以使用所有使用者的perf_events捕獲呼叫堆疊:
  • 我們將perf_event_paranoid設定為1,這將允許探查器收集效能資訊:

$ sudo sh -c 'echo 1 >/proc/sys/kernel/perf_event_paranoid'

  • 我們將kptr_restrict設定為0以消除對公開核心地址的限制:

$ sudo sh -c 'echo 0 >/proc/sys/kernel/kptr_restrict'


async-profiler可以在macOS平臺上自行執行。
 

現在我們的平臺已經準備就緒,我們可以構建分析應用程式並使用Java命令執行它:

$ java -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints -jar path-to-jar-file


在這裡,我們使用-XX:+ UnlockDiagnosticVMOptions -XX:+ DebugNonSafepoints JVM標誌啟動了我們的分析應用程式,強烈建議您使用JVM標誌以獲得準確的結果。
現在我們已經準備好分析應用程式了,讓我們探索一下async-profiler支援的各種型別的分析。
 

CPU分析
在對CPU進行效能分析時,Async-profiler會收集Java方法的示例堆疊跟蹤,包括JVM程式碼,本機類和核心函式。
讓我們使用其PID來分析我們的應用程式:

$ ./profiler.sh -e cpu -d 30 -o summary 66959
Started [cpu] profiling
--- Execution profile --- 
Total samples       : 28
 
Frame buffer usage  : 0.069%


在這裡,我們使用-e選項定義了cpu分析事件。然後,我們使用-d <duration>選項收集樣本30秒鐘。
最後,該-o選項是有用的定義HTML、SVG和樹等輸出格式。
讓我們在對應用程式進行CPU分析時建立HTML輸出:

$ ./profiler.sh -e cpu -d 30 -f cpu_profile.html 66959

此外,async-profiler支援開箱即用的火焰圖。
讓我們使用.svg副檔名生成應用程式的CPU配置檔案的火焰圖:

$ ./profiler.sh -e cpu -d 30 -f cpu_profile.svg 66959


 

記憶體分配分析
同樣,我們無需使用位元組碼檢測等侵入性技術就可以收集記憶體分配的樣本。
async-profiler使用基於TLAB(執行緒本地分配緩衝區)的取樣技術來收集高於TLAB平均大小的堆分配的樣本。
透過使用alloc事件,我們可以使探查器能夠收集分析應用程式的堆分配:

$ ./profiler.sh -e alloc -d 30 -f alloc_profile.svg 66255


 

掛鐘分析
同樣,透過使用掛鐘配置檔案,async-profiler可以對所有執行緒進行取樣,而不論其狀態如何(例如執行,休眠或阻塞)。
在對應用程式啟動時間中的問題進行故障排除時,這可以派上用場。
透過定義wall事件,我們可以配置探查器以收集所有執行緒的樣本:

$ ./profiler.sh -e wall -t -d 30 -f wall_clock_profile.svg 66959


另外,我們可以使用list選項檢查JVM支援的所有分析事件:

$ ./profiler.sh list 66959
Basic events:
  cpu
  alloc
  lock
  wall
  itimer
Java method calls:
  ClassName.methodName


 

IntelliJ IDEA中的async-profiler
IntelliJ IDEA具有與async-profiler整合的功能,可作為Java的效能分析工具。詳細點選標題見原文

 

相關文章