Java虛擬機--常用Java命令(一)


1.Java常用命令

  jps:查看本機的Java進程信息。

  jstack:打印線程的棧信息,制作線程Dump。

  jmap:打印內存映射,只做堆Dump。

  jstat:性能監控工具。

  jhat:內存分析工具。

  jconsole:簡易的可視化控制台。

  jvisualvm:功能強大的控制台。

2.什么是Java Dump?有什么用?

  Java Dump就是虛擬機的運行時快照,其將Java虛擬機運行時的狀態和信息保存到文件中去。作用:可以了解程序運行時,虛擬機中的運行時狀態信息;針對非業務邏輯性的BUG,如內存泄漏、內存溢出等。

3.制作Java Dump

  ■ 使用Java虛擬機制作Dump

    -xx:+HeapDumpOnOutOfMemoryError     指示虛擬機在發生內存不足錯誤時,自動生成堆Dump。

  ■ 使用圖形工具制作Dump

    使用JDK 1.6 自帶的工具:Java VisualVM

  ■ 使用命令行制作Dump

    jstack:制作線程Dump 

    jmap:制作堆Dump

4.常用命令之jps

  作用

  顯示當前所有Java進程pid的命令。

  使用

  想要學習一個命令,先來看看幫助,使用jps -help查看幫助:

  

  -q 只顯示pid,不顯示class名稱,jar文件名和傳遞給main 方法的參數

  

  -l 輸出應用程序main class的完整package名 或者 應用程序的jar文件完整路徑名

  

  -v 輸出傳遞給JVM的參數

  

5.常用命令之javap

  javap是jdk自帶的一個工具,可以對代碼反編譯,也可以查看java編譯器生成的字節碼。

  javap命令分解一個class文件,它根據options來決定到底輸出什么。如果沒有使用options,那么javap將會輸出包,類里的protected和public域以及類里的所有方法。javap將會把它們輸出在標准輸出上。來看這個例子,先編譯(javac)下面這個類。

  

  在命令行上鍵入javap DocFooter后

  

  如果加入了-c,即javap -c DocFooter,輸出的字節碼如下:

  

  javap可以用於反編譯和查看編譯器編譯后的字節碼。用java -c比較多;該命令用於列出每個方法所執行的JVM指令,並顯示每個方法的字節碼的實際作用。

6.常用命令之jstack

  jstack是JDK自帶的一種堆棧跟蹤工具。

  jstack用於生成java虛擬機當前時刻的線程快照。線程快照是當前java虛擬機內每一條線程執行的方法堆棧的集合,生成線程快照的主要目的是定位線程長時間停頓的原因,如線程間死鎖、死循環等。線程出現停頓的時候通過jstack來查看各個線程的調用堆棧,就可以知道沒有響應的線程到底在后台做什么。如果java程序崩潰,生成core文件,jstack工具可以用來獲得core文件的java stack和native stack的信息,從而可以輕松的知道java程序是如何崩潰和在程序何處發出問題。

  讓我們先jstack -help

  

  -l 長列表,打印關於鎖的附加信息;-F 當-l沒有響應時強制打印棧信息;-m 打印javanative/c/c++框架的所有棧信息;pid用jps查詢。接下來讓我們來探討一下死鎖問題:什么是死鎖呢?打個比方:AB兩人去靶場打靶,就一把槍,A拿着子彈,B拿着槍,就這樣A需要B手中的槍才能打靶,同樣B需要A手中的子彈才能打靶,然后他倆大眼瞪小眼,誰也不說話,誰也不放下手中的東西,然后一眼萬年。。。這在程序中表現為兩把鎖,當發現死鎖問題時,用jstack是可以觀察到的如圖:

  

  上面的信息,明確的告訴了我們什么地方,哪條線程出現了死鎖。這樣我們就可以進行定位,然后解決了。

  備注:虛擬機執行FULL GC時,會阻塞所有的用戶線程,因此獲得同步所的線程也可能被阻塞。查看線程Dump時,首先要看內存使用情況。

7.常用命令之jmap

  jmap主要用於打印指定Java進程的共享內存映射或堆內存細節,可以用jmap生成堆Dump。

  什么是堆Dump?

  是反映內存使用情況的內存鏡像,其中主要包括系統信息虛擬機屬性完整的線程Dump所有類對象的狀態等。一般在GC異常、內存不足的情況下,我們懷疑又內存泄漏,這時候我們就可以制作Heap Dump來查看情況,分析原因。

  首先jmap后,會出現-help的信息:

  

  

  

  查看內存使用情況,用jmap -heap pid:

  

  產看堆內存(histogram)中的對象數量及大小,用jmap -histo  pid:(用histo:live時,會先觸發gc,然后統計信息)

  

  將內存使用情況輸出到文件,執行的命令是:jmap  -dump:fomat=b,file=heapDump  pid,然后用jhat命令可以參看:jhat -port 5000 heapDump,然后在瀏覽器中訪問:http:localhost:5000/產看信息:

   

  

  備注:

  ■ 如果程序內存不足或頻繁GC時,很可能存在內存泄漏的情況,此時就可以借助Java堆Dump查看對象的情況。

  ■ 制作heap Dump 可以用jamp命令

  ■ 可以先用jmap -heap查看內存的使用情況

  ■ 使用jamp -histo:[live] 查看堆內存的使用情況,如果大量對象在持續被引用,並沒有釋放掉,則產生了內存泄漏,就要結合代碼,把不用的對象釋放掉。

  ■ 也可以用jmap -dump:format=b,file=<fileName> pid 將堆信息保存到文件中,然后用jhat產看。

  ■ 如果出現內存泄漏等情況,建議多Dump幾次。

    參考資料http://www.hollischuang.com/archives/308

 

 

 

 

 

 

 

  

 

 

 

 

  

  

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM