Java開發(fā)者必備常用的工具,準點下班不在話下
以一問一答的形式學習java工具
Q:檢查內存泄露的工具有?
A: jmap生成dump轉儲文件,jhat可視化查看。
Q:某進程CPU使用率一直占滿,用什么工具可以排查?
A:top -Hp pid找到最占CPU的線程
然后jstack來查找那個線程此時所處的堆棧,確定問題發(fā)生位置。

各工具詳細介紹
jstack
全稱:JVM Stack Trance
作用:查看某個java進程的堆棧情況, 可用于確認死鎖、IO等待、死循環(huán)等問題。
命令用法:
jstack pid
查看死鎖例子如下圖,找到wait的lock和已被鎖的lock

查看等待IO例子:

jstat
作用:查看進程中內存使用情況,但只能給出一些簡單統(tǒng)計數據
統(tǒng)計加載了多少類以及占用空間 jstat -class pid
統(tǒng)計編譯了多少文件 jstat -compiler 10
Q: jstat -GCutil {pid} 2000 可以每隔2秒,對pid進程打印內存使用統(tǒng)計信息。
GCutil的輸出如下:

里面哪個百分比如果長期處于99%-100%會有OMM風險?(OutOfMemoryError)
A:如果E和O即新生代、老年代內存區(qū)一直都處于滿的狀態(tài),則很有可能會引發(fā)OMM風險。就像下面這個。

jmap
全稱: JVM Memory Map
作用:生成進程的內存堆快照
當需要看一下進程里是什么東西占用了過多內存時, 可以用jmap打印一下堆快照。
命令用法:
打印堆快照: jmap -dump:file=./dumpfile.dump 進程pid
查看特定類所占用的情況: jmap -histo:live 進程pid | grep 類名
Q: 用jmap檢查內存泄漏實例
我分了3次,每個1h調用jmap查看進程的內存實例,查看該時刻各對象數量
第一次查看情況如下:

第二次隔了2各小時,查看情況如下:

請問哪個對象可能有內存泄漏風險?
A:ObjectA可能有泄露, 因為他的對象數量增加最快,說明對象一直在增加且很多無法進行GC釋放。
jhat
全稱: JVM Heap Analysis Tool
作用:和jmap配合, 可以解析jmap生成的堆快照, 支持生成1個web進程供我們分析和查看。
命令用法:
jhat -J-Xmx515M dumpfile.dump
此時就會啟動1個webServer,然后我們去訪問就行了

jdb
全稱:Java Debugger
作用:用來對core文件和正在運行的Java進程進行實時地調試,類似于c++里的gdb
常見用法:
啟動進程并調試: jdb -classpath . Test
至二級調試某進程: jdb -attach 8000 -sourcepath /Users/wefit/Development/study/java/jtest/src/
jcmd
作用:多功能的工具,可以用它來導出堆、查看Java進程、導出線程信息、執(zhí)行GC、還可以進行采樣分析,可以理解為1個性能調優(yōu)時用的工具。
常見命令:
查看 當前機器上所有的 jvm 進程信息: jcmd -l
查看指定進程的性能統(tǒng)計信息: jcmd pid PerfCounter.print
列出當前運行的 java 進程可以執(zhí)行的操作: jcmd PID help
查看線程堆棧信息: jcmd PID Thread.print
查看堆內存信息: jcmd PID GC.heap_dump FILE_NAME
jps
簡單記法: JVM process status
全名:Java Virtual Machine Process Status Tool
作用: 顯示?當前系統(tǒng)用戶?的?所有?Java進程情況及其進程號
常用命令:
查看進程jvm參數:jps -v
輸出程序main class的完整package名或程序的jar文件完整路徑名:jps -l
輸出傳遞給main方法的參數:jps -m
jinfo
jvm infomation
作用:和jps功能類似,但是支持根據指定pis查看指定進程
可以查看JVM參數、系統(tǒng)參數、調整jvm參數
但不支持查看java程序的內存使用情況
javap
把java字節(jié)碼文件反匯編為Java源碼文件。
javac
java編譯工具
javac的執(zhí)行過程:

JDK可視化工具
jconsole
可監(jiān)控jvm,即可監(jiān)控本地jvm也可監(jiān)控遠程jvm,管理應用程序,可以檢查死鎖等諸多問題。

jvisualvm
jvisualvm可以監(jiān)控遠程服務器的運行狀態(tài)
可以在java程序運行起來后再運行, 通過某些協(xié)議連接到java進程中。
運行時, 可以不需要配置配置環(huán)境、虛擬機參數等。
想要獲取更多學習資料嗎?評論回復“666”,尚學堂最新的教學資料就是你的啦~

