引子
這段時間項目新版本要發了,所以跟着QA分析性能測試和壓力測試,用了平時不怎麼用的很多工具:
- jmap :idea:
jmap -heap pid → 查看堆的使用狀況信息
jmap -histo:live pid | less → 堆中活動的對象以及大小
jmap -dump:format=b,file=eclipse_heap.bin pid → Dump堆信息 - jstat,可以查看很多內容 :idea:
jstat -gcutil -h 20 pid 1000 100 → 查看Java進程GC的情況,1000ms統計一次gc情況統計100次 - jstack,查看jvm線程運行狀態,是否有死鎖現象等等信息
jstack pid → Dump線程信息 - jinfo,查看jvm配置信息
- jps
- jconsole,圖形界面。可以持續收集內存、線程信息,並以曲線的方式顯示出來。
# 這個工具真正要做的功能是查看JMX Bean的信息,性能分析中並不關心JMX信息。 - mat :idea: ,分析內存Dump,查找內存泄漏。http://www.eclipse.org/mat/
- JProfiler,商業 :evil: Profile工具。查看內存、CPU的使用,強勁
VisualVM在JDK1.6 Update7之後的版本中推出,就放在bin目錄下面。
VisualVM在的官方網站在 https://visualvm.dev.java.net 。JDK1.6 Update7之前的版本可以單獨下載使用。
VisualVM使用簡單,幾乎0配置,功能還是比較豐富的,幾乎囊括了其它JDK自帶命令的所有功能。
- 內存信息
- 線程信息
- Dump堆(本地進程)
- Dump線程(本地進程)
- 打開堆Dump。堆Dump可以用jmap來生成。
- 打開線程Dump
- 生成應用快照(包含內存信息、線程信息等等)
- 性能分析。 :idea: CPU分析(各個方法調用時間),內存分析(各類對象佔用的內存)
- ……
PS:
跟着QA做性能測試和壓力測試,很多收穫和感觸。
- 雖然有UI工具,尤其是商業的工具如JProfiler,功能異常強大,但是命令行工具還是非常有市場的。
- 線上出問題時,命令行能方便和快速的Dump出Heap信息和線程信息,然後再對Dump分析;或是JVM信息,如GC次數、JVM參數。命令行對目標的產生的壓力小,UI工具可能無法連上。
- JDK自帶命令行是環境標配的,你總是可以使用。UI可能要安裝,等裝好,菜都涼了。
- 往往是對工具的不瞭解纔不能解決問題,JDK自帶的工具已經可以解決很多問題了。強大的商業工具往往只是增加學習難度。
- 只有測試得出的結果纔是可信的,之前的推測往往不可靠的。
- 系統地收集和保證數據,這樣當發現問題時,就有更可以用作判斷的信息。
參考資料:
- 好用的性能分析工具–VisualVM
- 可與jprofiler/yourkit媲美的java診斷工具Visualvm
- visualvm的官方網站: https://visualvm.dev.java.net/download.html
- 一個Eclipse插件,啓動時附帶啓動visualvm來作性能分析:https://visualvm.dev.java.net/eclipse-launcher.html