使用async-profiler進行JVM記憶體效能微調的指南 | Baeldung
通常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的效能分析工具。詳細點選標題見原文
相關文章
- jps、jmap、jstack已經Out了,使用jcmd進行JVM效能和記憶體跟蹤微調 -DZone JavaJSJVM記憶體Java
- JVM效能調優,記憶體分析工具JVM記憶體
- 效能調優(cpu/IO/JVM記憶體分析)JVM記憶體
- [效能]【JVM】關於JVM記憶體的N個問題JVM記憶體
- Java的記憶體 -JVM 記憶體管理Java記憶體JVM
- 【JAVA進階架構師指南】之五:JVM效能調優Java架構JVM
- 【JVM】堆體系結構及其記憶體調優JVM記憶體
- jvm-44-jvm 記憶體效能分析工具 Eclipse Memory Analyzer Tool (MAT) / 記憶體分析器 (MAT)JVM記憶體Eclipse
- JVM執行時資料區探索與直接記憶體的使用JVM記憶體
- JVM記憶體分析JVM記憶體
- jvm 堆記憶體JVM記憶體
- JVM記憶體模型JVM記憶體模型
- JVM的記憶體區域JVM記憶體
- Mqttnet記憶體與效能改進錄MQQT記憶體
- JVM(七):JVM記憶體結構JVM記憶體
- (2)Linux效能調優之Linux記憶體體系Linux記憶體
- NIO的JVM記憶體和機器記憶體的選擇JVM記憶體
- JVM記憶體-GC策略JVM記憶體GC
- JVM 記憶體區域JVM記憶體
- 【JVM記憶體區域】JVM記憶體
- JVM記憶體結構JVM記憶體
- JVM-記憶體模型JVM記憶體模型
- jvm 記憶體洩漏JVM記憶體
- JVM記憶體模型(五)JVM記憶體模型
- HotSpot JVM 記憶體管理HotSpotJVM記憶體
- JVM——記憶體洩漏與記憶體溢位JVM記憶體溢位
- JVM記憶體GC的騙局JVM記憶體GC
- JVM -- 物件的記憶體佈局JVM物件記憶體
- JVM系列(二) - JVM記憶體區域JVM記憶體
- JVM執行時記憶體資料區域JVM記憶體
- npm打包進行記憶體限制NPM記憶體
- python如何進行記憶體管理Python記憶體
- Python如何進行記憶體管理?Python記憶體
- JVM記憶體分為3個記憶體空間JVM記憶體
- iOS 使用Instruments優化記憶體效能iOS優化記憶體
- JVM的基本結構和JVM的記憶體結構JVM記憶體
- jvm記憶體管理機制JVM記憶體
- 再探JVM記憶體模型JVM記憶體模型