天天看點

Java問題排查利器jpsjinfojstattopjstackjmapjhat

jps

輸出JVM中運作的程序狀态資訊

-q 不輸出類名、Jar名和傳入main方法的參數

-m 輸出傳入main方法的參數

-l 輸出main類或Jar的全限名

-v 輸出傳入JVM的參數

jps -m -l
1217 com.xxxx.sunfire.agent.Main
3093 org.apache.catalina.startup.Bootstrap start
84153 sun.tools.jps.Jps -m -l

jps -mlvV
           

jinfo

//檢視程序系統配置資訊和參數
jinfo 3093
           

jstat

jstat [option] pid
           

-gc:

輸出每個堆區域的目前可用空間以及已用空間(伊甸園,幸存者等等),GC執行的總次數,GC操作累計所花費的時間。

-gcutil:

輸出每個堆區域使用占比,以及GC執行的總次數和GC操作所花費的事件。

-gccause:

輸出-gcutil提供的資訊以及最後一次執行GC的發生原因和目前所執行的GC的發生原因

-gccapactiy:

輸出每個堆區域的最小空間限制(ms)/最大空間限制(mx),目前大小,每個區域之上執行GC的次數。(不輸出目前已用空間以及GC執行時間)。

-gcnew:

輸出新生代空間的GC性能資料

-gcnewcapacity:

輸出新生代空間的大小的統計資料。

-gcold:

輸出老年代空間的GC性能資料。

-gcoldcapacity:

輸出老年代空間的大小的統計資料。

-gcpermcapacity:

輸出持久帶空間的大小的統計資料。

// 檢視程序ID為3093的GC資料,每隔1000毫秒重新整理一次
jstat  -gc 3093 1000 

 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
218432.0 218432.0 22575.7  0.0   2184576.0 1408239.1 1572864.0   276702.7  249216.0 240828.9 29312.0 27607.0     26    2.436   0      0.000    2.436
218432.0 218432.0 22575.7  0.0   2184576.0 1411475.7 1572864.0   276702.7  249216.0 240828.9 29312.0 27607.0     26    2.436   0      0.000    2.436
218432.0 218432.0 22575.7  0.0   2184576.0 1413157.0 1572864.0   276702.7  249216.0 240828.9 29312.0 27607.0     26    2.436   0      0.000    2.436
218432.0 218432.0 22575.7  0.0   2184576.0 1427651.8 1572864.0   276702.7  249216.0 240828.9 29312.0 27607.0     26    2.436   0      0.000    2.436
218432.0 218432.0 22575.7  0.0   2184576.0 1427706.7 1572864.0   276702.7  249216.0 240828.9 29312.0 27607.0     26    2.436   0      0.000    2.436

//額外輸出上次GC原因
jstat -gccause
           

S0C:輸出Survivor0空間的大小。機關KB。

S1C:輸出Survivor1空間的大小。機關KB。

S0U:輸出Survivor0已用空間的大小。機關KB。

S1U:輸出Survivor1已用空間的大小。機關KB。

EC:輸出Eden空間的大小。機關KB。

EU:輸出Eden已用空間的大小。機關KB。

OC:輸出老年代空間的大小。機關KB。

OU:輸出老年代已用空間的大小。機關KB。

MC(PC):輸出方法區(持久代)空間的大小。機關KB。

MU(PU):輸出方法區(持久代)已用空間的大小。機關KB。

CCSC:輸出壓縮類空間大小。機關KB。

CCSU:輸出壓縮類空間使用大小。機關KB。

YGC:新生代空間GC時間發生的次數。

YGCT:新生代GC處理花費的時間。

FGC:full GC發生的次數。

FGCT:full GC操作花費的時間

GCT:GC操作花費的總時間。

NGCMN: 新生代最小空間容量,機關KB。

NGCMX: 新生代最大空間容量,機關KB。

NGC:新生代目前空間容量,機關KB。

OGCMN: 老年代最小空間容量,機關KB。

OGCMX: 老年代最大空間容量,機關KB。

OGC:老年代目前空間容量制,機關KB。

PGCMN: 持久代最小空間容量,機關KB。

PGCMX: 持久代最大空間容量,機關KB。

PGC:持久代目前空間容量,機關KB。

PC:持久代目前空間大小,機關KB。

PU:持久代目前已用空間大小,機關KB。

LGCC:最後一次GC發生的原因。

GCC:目前GC發生的原因。

TT:老年化門檻值。被移動到老年代之前,在新生代空存活的次數。

MTT:最大老年化門檻值。被移動到老年代之前,在新生代空存活的次數。

DSS:幸存者區所需空間大小,機關KB。

top

//檢視3093程序内所有線程資訊
top -Hp 3093 
//獲得線程10進制轉16進制後jstack去抓看這個線程到底在幹啥
printf "%x\n" 3093
           

jstack

檢視某個Java的線程堆棧資訊

Java問題排查利器jpsjinfojstattopjstackjmapjhat

-l long listings,會列印出額外的鎖資訊,在發生死鎖時可以用jstack -l pid來觀察鎖持有情況

-m mixed mode,不僅會輸出Java堆棧資訊,還會輸出C/C++堆棧資訊(比如Native方法)

http://fastthread.io/

jstack -F -m 3093
           

jmap

//檢視堆記憶體使用狀況
jmap -heap 3093

Attaching to process ID 3093, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.112-b129

using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 4294967296 (4096.0MB)
   NewSize                  = 2684354560 (2560.0MB)
   MaxNewSize               = 2684354560 (2560.0MB)
   OldSize                  = 1610612736 (1536.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 10
   MetaspaceSize            = 536870912 (512.0MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 536870912 (512.0MB)
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 2460680192 (2346.6875MB)
   used     = 82042008 (78.2413558959961MB)
   free     = 2378638184 (2268.446144104004MB)
   3.3341190889709895% used
Eden Space:
   capacity = 2237005824 (2133.375MB)
   used     = 57162688 (54.51458740234375MB)
   free     = 2179843136 (2078.8604125976562MB)
   2.555321375864241% used
From Space:
   capacity = 223674368 (213.3125MB)
   used     = 24879320 (23.726768493652344MB)
   free     = 198795048 (189.58573150634766MB)
   11.123008962743555% used
To Space:
   capacity = 223674368 (213.3125MB)
   used     = 0 (0.0MB)
   free     = 223674368 (213.3125MB)
   0.0% used
concurrent mark-sweep generation:
   capacity = 1610612736 (1536.0MB)
   used     = 290819000 (277.3466110229492MB)
   free     = 1319793736 (1258.6533889770508MB)
   18.056419988473255% used

86588 interned Strings occupying 8608688 bytes.
           
//檢視堆記憶體中的對象數目
jmap -histo 3093
           
//把程序記憶體使用情況dump到檔案中,後續再用jhat、MAT、VisualVM等工具分析檢視, 如果太大可以調整堆記憶體大小後,重新開機服務,當full GC發生且清理不了資料後 把 記憶體dump下來
jmap  -dump:format=b,file=/tmp/dump.dat -F 3093
           

http://blog.sina.com.cn/s/blog_7ed002b30102uxbf.html

jhat

sudo -u push /usr/local/paas-agent/jdk1.8.0_45/bin/jps -mlvV sudo -u push /usr/local/paas-agent/jdk1.8.0_45/bin/jinfo 99474 /usr/local/paas-agent/jdk1.8.0_45/bin/jstat -gc 99474 1000 top -Hp 99474 sudo -u push /usr/local/paas-agent/jdk1.8.0_45/bin/jstack -F -m 99474 sudo -u push /usr/local/paas-agent/jdk1.8.0_45/bin/jmap -heap 99474 sudo -u push /usr/local/paas-agent/jdk1.8.0_45/bin/jmap -histo 99474 sudo -u push /usr/local/paas-agent/jdk1.8.0_45/bin/jstack 24278 > /tmp/jstack.txt sudo -u push /usr/local/paas-agent/jdk1.8.0_45/bin/jmap -dump:format=b,live,file=/tmp/dump.txt 2109 sudo -u push /usr/local/paas-agent/jdk1.8.0_45/bin/jmap -histo:live 2109 > /tmp/jmap-histo.txt sudo -u push /usr/local/paas-agent/jdk1.8.0_45/bin/jstack 20331 > /tmp/jstack.txt sudo -u push /usr/local/jdk11/bin/jstack 9172 > /tmp/jstack.txt sudo -u push /usr/local/jdk-11.0.1/bin/jstack 15797 > /tmp/jstack.txt sudo -u push /usr/local/paas-agent/jdk1.8.0_45/bin/jmap -dump:format=b,file=/tmp/dump.txt 16629 sudo -u push /usr/local/paas-agent/jdk1.8.0_45/bin/jmap -histo 20393 > /tmp/jmap-histo.txt ps -mp 38789 -o THREAD,tid,time | sort -rn