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

查看等待IO例子:

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

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

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

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

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

§ jdb
全稱:Java Debugger
作用:用來(lái)對(duì)core文件和正在運(yùn)行的Java進(jìn)程進(jìn)行實(shí)時(shí)地調(diào)試,類似于c++里的gdb
常見(jiàn)用法:
啟動(dòng)進(jìn)程并調(diào)試: jdb -classpath . Test
至二級(jí)調(diào)試某進(jìn)程: jdb -attach 8000 -sourcepath /Users/wefit/Development/study/java/jtest/src/
§ jcmd
作用:多功能的工具,可以用它來(lái)導(dǎo)出堆、查看Java進(jìn)程、導(dǎo)出線程信息、執(zhí)行GC、還可以進(jìn)行采樣分析,可以理解為1個(gè)性能調(diào)優(yōu)時(shí)用的工具。
常見(jiàn)命令:
查看 當(dāng)前機(jī)器上所有的 jvm 進(jìn)程信息: jcmd -l
查看指定進(jìn)程的性能統(tǒng)計(jì)信息: 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
簡(jiǎn)單記法: JVM process status
全名:Java Virtual Machine Process Status Tool
作用: 顯示?當(dāng)前系統(tǒng)用戶?的?所有?Java進(jìn)程情況及其進(jìn)程號(hào)
常用命令:
查看進(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í)行過(guò)程:

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

§ jvisualvm
Q:
jvisualvm可以監(jiān)控遠(yuǎn)程服務(wù)器的運(yùn)行狀態(tài)
可以在java程序運(yùn)行起來(lái)后再運(yùn)行, 通過(guò)某些協(xié)議連接到j(luò)ava進(jìn)程中。
運(yùn)行時(shí), 可以不需要配置配置環(huán)境、虛擬機(jī)參數(shù)等。
文章轉(zhuǎn)自網(wǎng)絡(luò)侵刪
想要了解更多可以點(diǎn)擊:2021年AJAX零基礎(chǔ)入門_Ajax+Jquery+JSON視頻系統(tǒng)講義