JVM總結之命令行工具

jps

jps位於jdk的bin目錄下,其做用是顯示當前系統的java進程狀況,及其id號。 jps至關於Solaris進程工具ps。不象」pgrep java」或」ps -ef grep java」,jps並不使用應用程序名來查找JVM實例。所以,它查找全部的Java應用程序,包括即便沒有使用java執行體的那種(例如,定製的啓動 器)。html

jps僅查找當前用戶的Java進程,而不是當前系統中的全部進程。java

jstack

Jstack是java虛擬機自帶的一種堆棧跟蹤工具。瀏覽器

jstack用於生成java虛擬機當前時刻的線程快照。線程快照是當前java虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的緣由,如線程間死鎖、死循環、請求外部資源致使的長時間等待等。app

經過對線程狀態的查看,結合源碼,通常都能找出hung住線程的緣由。jvm

線程狀態工具

  • NEW,未啓動的。不會出如今Dump中。
  • RUNNABLE,在虛擬機內執行的。
  • BLOCKED,受阻塞並等待監視器鎖。
  • WATING,無限期等待另外一個線程執行特定操做。
  • TIMED_WATING,有時限的等待另外一個線程的特定操做。
  • TERMINATED,已退出的。

jstack的用法:學習

jstack [進程號]

可獲得以下相似結果:spa

"main" #1 prio=5 os_prio=31 tid=0x00007fc918809800 nid=0x1c03 waiting on condition [0x0000700007a01000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at com.aheizi.cmd.JpsTest.main(JpsTest.java:11)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

再根據線程狀態和具體代碼進行分析。命令行

jmap

查看堆使用狀況:線程

jmap -heap 2357

查看堆內存(histogram)中的對象數量及大小:

jmap -histo 2357

將內存使用的詳細狀況輸出到文件:

jmap -dump:format=b,file=heapDump 2357

輸出到文件以後能夠經過jhat -port 7000 heapDump在瀏覽器訪問http://localhost:7000/ 查看詳細信息

Jmap使用心得

  1. 若是程序內存不足或者頻繁GC,頗有可能存在內存泄露狀況,這時候就要藉助Java堆Dump查看對象的狀況。
  2. 要製做堆Dump能夠直接使用jvm自帶的jmap命令
  3. 能夠先使用jmap -heap命令查看堆的使用狀況,看一下各個堆空間的佔用狀況。
  4. 使用jmap -histo:[live]查看堆內存中的對象的狀況。若是有大量對象在持續被引用,並無被釋放掉,那就產生了內存泄露,就要結合代碼,把不用的對象釋放掉。
  5. 也可使用 jmap -dump:format=b,file=<fileName>命令將堆信息保存到一個文件中,再借助jhat命令查看詳細內容
  6. 在內存出現泄露、溢出或者其它前提條件下,建議多dump幾回內存,把內存文件進行編號歸檔,便於後續內存整理分析。

jstat

jstat [ generalOption | outputOptions vmid [interval[s|ms][count]] ]

參數:
generalOption: 通常使用-gcutil查看GC狀況
vmid: 虛擬機進程號,即當前運行的java進程號
interval: 間隔時間,單位爲秒或毫秒
count: 打印次數,若是缺省則打印無數次

參數interval和count表明查詢間隔和次數,若是省略這兩個參數,說明只查詢一次。假設須要每250毫秒查詢一次進程2357垃圾收集情況,一共查詢5次,那命令行以下:

jstat -gc 2357 250 5

參數說明以下:
S0: 新生代中Survivor space 0區已使用空間的百分比
S1: 新生代中Survivor space 1區已使用空間的百分比
E: 新生代已使用空間的百分比
O: 老年代已使用空間的百分比
P: 永久帶已使用空間的百分比
YGC: 從應用程序啓動到當前,發生Yang GC 的次數
YGCT: 從應用程序啓動到當前,Yang GC所用的時間【單位秒】
FGC: 從應用程序啓動到當前,發生Full GC的次數
FGCT: 從應用程序啓動到當前,Full GC所用的時間
GCT: 從應用程序啓動到當前,用於垃圾回收的總時間【單位秒】

jhat

jhat前面已經用過了。使用jmap能夠生成Java堆的Dump文件。生成dump文件以後就能夠用jhat命令,將dump文件轉成html的形式,而後經過http訪問能夠查看堆狀況。

分析過程總結

獲取Java Dump的方法

  1. 利用Java虛擬機,增長-XX:+HeapDumpOnOutOfMemoryError的配置,自動生成dump文件
  2. 使用JDK1.6自帶的工具:Java VisualVM
  3. 使用命令行:jstack:打印線程的棧信息,製做線程Dump。jmap:打印內存映射,製做堆Dump。

步驟:

  1. 檢查虛擬機版本(java -version)
  2. 找出目標Java應用的進程ID(jps)
  3. 使用jstack命令製做線程Dump / Linux環境下使用kill命令製做線程Dump
  4. 使用jmap命令製做堆Dump

參考資料:

Java命令學習系列

相關文章
相關標籤/搜索