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 打印java和native/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幾回。