幾款Java開發(fā)者必備常用的工具,準(zhǔn)點(diǎn)下班不在話下
以一問一答的形式學(xué)習(xí)java工具
Q:檢查內(nèi)存泄露的工具有?
A: jmap生成dump轉(zhuǎn)儲文件,jhat可視化查看。
Q:某進(jìn)程CPU使用率一直占滿,用什么工具可以排查?
A:
top -Hp pid找到最占CPU的線程
然后jstack來查找那個線程此時所處的堆棧,確定問題發(fā)生位置。
§ 各工具詳細(xì)介紹
§ jstack
全稱: JVM Stack Trance
作用: 查看某個java進(jìn)程的堆棧情況, 可用于確認(rèn)死鎖、IO等待、死循環(huán)等問題。
命令用法:
jstack pid
查看死鎖例子如下圖,找到wait的lock和已被鎖的lock

查看等待IO例子:

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

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

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

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

請問哪個對象可能有內(nèi)存泄漏風(fēng)險?
A:
ObjectA可能有泄露, 因?yàn)樗膶ο髷?shù)量增加最快,說明對象一直在增加且很多無法進(jìn)行GC釋放。
§ jhat
全稱: JVM Heap Analysis Tool
和jmap配合, 可以解析jmap生成的堆快照, 支持生成1個web進(jìn)程供我們分析和查看。
命令用法:
jhat -J-Xmx515M dumpfile.dump
此時就會啟動1個webServer,然后我們?nèi)ピL問就行了

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

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

§ jvisualvm
Q:
jvisualvm可以監(jiān)控遠(yuǎn)程服務(wù)器的運(yùn)行狀態(tài)
可以在java程序運(yùn)行起來后再運(yùn)行, 通過某些協(xié)議連接到j(luò)ava進(jìn)程中。
運(yùn)行時, 可以不需要配置配置環(huán)境、虛擬機(jī)參數(shù)等。

文章來自網(wǎng)絡(luò)侵刪
想要了解更多可以點(diǎn)擊:
尚學(xué)堂java基礎(chǔ)入門教_java基礎(chǔ)視頻java基礎(chǔ)教程_java300集java入門