火焰图 性能分析 java,使用火焰图进行Java应用性能分析
作者: 一字馬胡
轉載標志 【2017-11-19】
更新日志
日期
更新內容
備注
2017-11-19
新建文章
初版
導入
本文主要想要記錄進行java應用性能分析的一種方式,也就是使用火焰圖來進行java應用性能分析,本文將介紹一些工具,包括如何生成profile數據,以及如何根據profile數據生成火焰圖等,本文的內容都基于Linux(Ubuntu x64)系統,這一點需要特別注意。如果你有時間的話,可以去閱讀以下Java Flame Graphs,作者是Brendan Gregg大神,本文介紹的生成火焰圖的工具就出自Brendan Gregg之手。
Action
首先,我們需要收集java代碼運行時的profile數據,本文使用的是一個叫做lightweight-java-profiler的工具,你需要下載lightweight-java-profiler,并且自己編譯才能使用它來進行數據收集,關于lightweight-java-profiler的更多的細節介紹,可以參考參考鏈接。你可以直接在github搜索lightweight-java-profiler,并且clone到本地進行編譯,當然在編譯之前你可以進行一些數據收集的方案定制:
// Things that should probably be user-configurable
// Number of times per second that we profile
static const int kNumInterrupts = 100;
// Maximum number of stack traces
static const int kMaxStackTraces = 3000;
// Maximum number of frames to store from the stack traces sampled.
static const int kMaxFramesToCapture = 128;
// Location where the data are dumped.
static const char kDefaultOutFile[] = "traces.txt";
上面的參數設定在globals.h文件中可以找到,可以根據實際情況進行設定,比如kNumInterrupts的意思就是每秒鐘進行數據收集的次數,默認輸出profile數據的文件的名字為“traces.txt”,這些你都可以做自定義修改,當改好的之后就可以進行編譯了,在64位機器上編譯可以使用下面的命令:
make BITS=64 all
如果順利的話,可以看到會生成一個build-64的文件夾,里面有一個.so文件叫做liblagent.so,這就是我們需要的收集profile數據的.so文件?,F在,你可以在啟動你的java應用的時候加上下面的參數:
-agentpath:${path}/lightweight-java-profiler/build-64/liblagent.so
然后就可以獲取到trace.txt文件。接下來,就需要將java應用的運行時profile數據轉換為可視化的火焰圖來進行性能分析了,將profile數據轉換為火焰圖的工具上文已經提到過,可以在FlameGraph下載,下載完成之后,就可以運行下面的命令來生成火焰圖了:
cd FlameGraph
./stackcollapse-ljp.awk < ${path}/traces.txt | ./flamegraph.pl > {$path}/traces.svg
現在,你應該可以得到一個火焰圖的.svg文件了,在瀏覽器中打開就可以看到火焰圖的細節了。關于火焰圖,可以參考下面的說明:
The y-axis is stack depth, and the x-axis spans the sample population. Each rectangle is a stack frame. Color is not important, it's randomized to differentiate frames. The ordering from left to right is also unimportant.
You look for the widest frames, from bottom up, and forks in the "flames", which indicate different code paths taken
所以,我們在看火焰圖的時候,主要關注比較寬的就可以發現性能問題了,因為越寬代表占用的CPU時間越多,也就越是性能瓶頸,當然這種分析得結合實際的應用代碼,下面是一張火焰圖,具體的分析就不在本文的中進行了。本文僅記錄一種分析java應用性能問題的方案,采用觀察運行時火焰圖的方式來發現應用的性能瓶頸是一種比較直觀的方法,而采集profile數據使用lightweight-java-profiler,將采集到的profile數據轉換為火焰圖使用工具FlameGraph,當未來需要對java應用進行性能優化的時候,可以采用這種方案來發現性能瓶頸,并及時進行優化。
火焰圖示例
總結
以上是生活随笔為你收集整理的火焰图 性能分析 java,使用火焰图进行Java应用性能分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java如何计算时间天数差,java计算
- 下一篇: php适合响应式吗,响应式和自适应