Java虚拟机--常用Java命令(一)
1.Java常用命令
jps:查看本機的Java進程信息。
jstack:打印線程的棧信息,制作線程Dump。
jmap:打印內(nèi)存映射,只做堆Dump。
jstat:性能監(jiān)控工具。
jhat:內(nèi)存分析工具。
jconsole:簡易的可視化控制臺。
jvisualvm:功能強大的控制臺。
2.什么是Java Dump?有什么用?
Java Dump就是虛擬機的運行時快照,其將Java虛擬機運行時的狀態(tài)和信息保存到文件中去。作用:可以了解程序運行時,虛擬機中的運行時狀態(tài)信息;針對非業(yè)務(wù)邏輯性的BUG,如內(nèi)存泄漏、內(nèi)存溢出等。
3.制作Java Dump
■ 使用Java虛擬機制作Dump
-xx:+HeapDumpOnOutOfMemoryError 指示虛擬機在發(fā)生內(nèi)存不足錯誤時,自動生成堆Dump。
■ 使用圖形工具制作Dump
使用JDK 1.6 自帶的工具:Java VisualVM
■ 使用命令行制作Dump
jstack:制作線程Dump
jmap:制作堆Dump
4.常用命令之jps
作用
顯示當(dāng)前所有Java進程pid的命令。
使用
想要學(xué)習(xí)一個命令,先來看看幫助,使用jps -help查看幫助:
-q 只顯示pid,不顯示class名稱,jar文件名和傳遞給main 方法的參數(shù)
-l 輸出應(yīng)用程序main class的完整package名 或者 應(yīng)用程序的jar文件完整路徑名
-v 輸出傳遞給JVM的參數(shù)
5.常用命令之javap
javap是jdk自帶的一個工具,可以對代碼反編譯,也可以查看java編譯器生成的字節(jié)碼。
javap命令分解一個class文件,它根據(jù)options來決定到底輸出什么。如果沒有使用options,那么javap將會輸出包,類里的protected和public域以及類里的所有方法。javap將會把它們輸出在標準輸出上。來看這個例子,先編譯(javac)下面這個類。
在命令行上鍵入javap DocFooter后
如果加入了-c,即javap -c DocFooter,輸出的字節(jié)碼如下:
javap可以用于反編譯和查看編譯器編譯后的字節(jié)碼。用java -c比較多;該命令用于列出每個方法所執(zhí)行的JVM指令,并顯示每個方法的字節(jié)碼的實際作用。
6.常用命令之jstack
jstack是JDK自帶的一種堆棧跟蹤工具。
jstack用于生成java虛擬機當(dāng)前時刻的線程快照。線程快照是當(dāng)前java虛擬機內(nèi)每一條線程執(zhí)行的方法堆棧的集合,生成線程快照的主要目的是定位線程長時間停頓的原因,如線程間死鎖、死循環(huán)等。線程出現(xiàn)停頓的時候通過jstack來查看各個線程的調(diào)用堆棧,就可以知道沒有響應(yīng)的線程到底在后臺做什么。如果java程序崩潰,生成core文件,jstack工具可以用來獲得core文件的java stack和native stack的信息,從而可以輕松的知道java程序是如何崩潰和在程序何處發(fā)出問題。
讓我們先jstack -help
-l 長列表,打印關(guān)于鎖的附加信息;-F 當(dāng)-l沒有響應(yīng)時強制打印棧信息;-m 打印java和native/c/c++框架的所有棧信息;pid用jps查詢。接下來讓我們來探討一下死鎖問題:什么是死鎖呢?打個比方:AB兩人去靶場打靶,就一把槍,A拿著子彈,B拿著槍,就這樣A需要B手中的槍才能打靶,同樣B需要A手中的子彈才能打靶,然后他倆大眼瞪小眼,誰也不說話,誰也不放下手中的東西,然后一眼萬年。。。這在程序中表現(xiàn)為兩把鎖,當(dāng)發(fā)現(xiàn)死鎖問題時,用jstack是可以觀察到的如圖:
上面的信息,明確的告訴了我們什么地方,哪條線程出現(xiàn)了死鎖。這樣我們就可以進行定位,然后解決了。
備注:虛擬機執(zhí)行FULL GC時,會阻塞所有的用戶線程,因此獲得同步所的線程也可能被阻塞。查看線程Dump時,首先要看內(nèi)存使用情況。
7.常用命令之jmap
jmap主要用于打印指定Java進程的共享內(nèi)存映射或堆內(nèi)存細節(jié),可以用jmap生成堆Dump。
什么是堆Dump?
是反映內(nèi)存使用情況的內(nèi)存鏡像,其中主要包括系統(tǒng)信息、虛擬機屬性、完整的線程Dump、所有類和對象的狀態(tài)等。一般在GC異常、內(nèi)存不足的情況下,我們懷疑又內(nèi)存泄漏,這時候我們就可以制作Heap Dump來查看情況,分析原因。
首先jmap后,會出現(xiàn)-help的信息:
查看內(nèi)存使用情況,用jmap -heap pid:
產(chǎn)看堆內(nèi)存(histogram)中的對象數(shù)量及大小,用jmap -histo pid:(用histo:live時,會先觸發(fā)gc,然后統(tǒng)計信息)
將內(nèi)存使用情況輸出到文件,執(zhí)行的命令是:jmap -dump:fomat=b,file=heapDump pid,然后用jhat命令可以參看:jhat -port 5000 heapDump,然后在瀏覽器中訪問:http:localhost:5000/產(chǎn)看信息:
備注:
■ 如果程序內(nèi)存不足或頻繁GC時,很可能存在內(nèi)存泄漏的情況,此時就可以借助Java堆Dump查看對象的情況。
■ 制作heap Dump 可以用jamp命令
■ 可以先用jmap -heap查看內(nèi)存的使用情況
■ 使用jamp -histo:[live] 查看堆內(nèi)存的使用情況,如果大量對象在持續(xù)被引用,并沒有釋放掉,則產(chǎn)生了內(nèi)存泄漏,就要結(jié)合代碼,把不用的對象釋放掉。
■ 也可以用jmap -dump:format=b,file=<fileName> pid 將堆信息保存到文件中,然后用jhat產(chǎn)看。
■ 如果出現(xiàn)內(nèi)存泄漏等情況,建議多Dump幾次。
參考資料:http://www.hollischuang.com/archives/308
總結(jié)
以上是生活随笔為你收集整理的Java虚拟机--常用Java命令(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抗生素药有哪些药(头孢是抗生素消炎药吗)
- 下一篇: 判断素数与产生素数表(质数)