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

1.Java經常使用命令java

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

  jstack:打印線程的棧信息,製做線程Dump。瀏覽器

  jmap:打印內存映射,只作堆Dump。框架

  jstat:性能監控工具。工具

  jhat:內存分析工具。性能

  jconsole:簡易的可視化控制檯。學習

  jvisualvm:功能強大的控制檯。spa

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

相關文章
相關標籤/搜索