jps:顯示所有java進程pid
jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一個顯示當前所有java進程pid的命令,簡單實用,非常適合在linux/unix平台上簡單察看當前java進程的一些簡單情況
jps類似linux/unix平台上上的ps命令,但是jps只查找查找所有的Java應用程序,包括即使沒有使用java執行體的那種(例如,定制的啟動器)。另外,jps僅查找當前用戶的Java進程,而不是當前系統中的所有進程。
學習一個命令,先來看看幫助,使用jps -help查看幫助:

- 參數介紹
-q 只顯示pid,不顯示class名稱,jar文件名和傳遞給main 方法的參數
-m 輸出傳遞給main 方法的參數,在嵌入式jvm上可能是null
-l 輸出應用程序main class的完整package名 或者 應用程序的jar文件完整路徑名
-v 輸出傳遞給JVM的參數
- 常用指令
jps:顯示當前用戶的所有java進程的PID
jps -v 3331:顯示虛擬機參數
jps -m 3331:顯示傳遞給main()函數的參數
jps -l 3331:顯示主類的全路徑

jinfo:實時查看和調整虛擬機參數(練習)
配置信息包括JAVA系統參數和命令行參數,如果運行在64位虛擬機上運行,需要指定-J-d64參數,
jstat:監控虛擬機各種運行狀態信息
jstat(JVM Statistics Monitoring Tool)是用於監控虛擬機各種運行狀態信息的命令行工具。他可以顯示本地或遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據,在沒有GUI圖形的服務器上,它是運行期定位虛擬機性能問題的首選工具。
查看幫助: jstat -help

利用JVM內建的指令對Java應用程序的資源和性能進行實時的命令行的監控,包括了對Heap size和垃圾回收狀況的監控。可見,Jstat是輕量級的、專門針對JVM的工具,非常適用。
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
- 參數解釋
Option — 選項,我們一般使用 -gcutil 查看gc情況
vmid — VM的進程號,即當前運行的java進程號
interval– 間隔時間,單位為秒或者毫秒
count — 打印次數,如果缺省則打印無數次
參數interval和count代表查詢間隔和次數,如果省略這兩個參數,說明只查詢一次
假設需要每250毫秒查詢一次進程5828垃圾收集狀況,一共查詢5次,那命令行如下
jstat -gc 5828 250 5
option:
選項option代表這用戶希望查詢的虛擬機信息,主要分為3類:類裝載、垃圾收集和運行期編譯狀況,具體選項及作用如下:
–class 監視類裝載、卸載數量、總空間及類裝載所耗費的時間
–gc 監視Java堆狀況,包括Eden區、2個Survivor區、老年代、永久代等的容量
–gccapacity 監視內容與-gc基本相同,但輸出主要關注Java堆各個區域使用到的最大和最小空間
–gcutil 監視內容與-gc基本相同,但輸出主要關注已使用空間占總空間的百分比 –gccause 與-gcutil功能一樣,但是會額外輸出導致上一次GC產生的原因
–gcnew 監視新生代GC的狀況
–gcnewcapacity 監視內容與-gcnew基本相同,輸出主要關注使用到的最大和最小空間
–gcold 監視老年代GC的狀況
–gcoldcapacity 監視內容與——gcold基本相同,輸出主要關注使用到的最大和最小空間
–gcpermcapacity 輸出永久代使用到的最大和最小空間
–compiler 輸出JIT編譯器編譯過的方法、耗時等信息
–printcompilation 輸出已經被JIT編譯的方法
- 常用指令
jstat –class <pid> : 顯示加載class的數量,及所占空間等信息
Loaded 裝載的類的數量
Bytes 裝載類所占用的字節數
Unloaded 卸載類的數量
Bytes 卸載類的字節數
Time 裝載和卸載類所花費的時間
C:\Users\laurarararararara>jstat -class 19004
Loaded Bytes Unloaded Bytes Time
3187 6007.9 0 0.0 1.99
jstat -compiler <pid>:顯示VM實時編譯的數量等信息
Compiled 編譯任務執行數量
Failed 編譯任務執行失敗數量
Invalid 編譯任務執行失效數量
Time 編譯任務消耗時間
FailedType 最后一個編譯失敗任務的類型
FailedMethod 最后一個編譯失敗任務所在的類及方法
jstat -gc <pid>: 可以顯示gc的信息,查看gc的次數,及時間
S0C 年輕代中第一個survivor(幸存區)的容量 (字節)
S1C 年輕代中第二個survivor(幸存區)的容量 (字節)
S0U 年輕代中第一個survivor(幸存區)目前已使用空間 (字節)
S1U 年輕代中第二個survivor(幸存區)目前已使用空間 (字節)
EC 年輕代中Eden(伊甸園)的容量 (字節)
EU 年輕代中Eden(伊甸園)目前已使用空間 (字節)
OC Old代的容量 (字節)
OU Old代目前已使用空間 (字節)
PC Perm(持久代)的容量 (字節)
PU Perm(持久代)目前已使用空間 (字節)
YGC 從應用程序啟動到采樣時年輕代中gc次數
YGCT 從應用程序啟動到采樣時年輕代中gc所用時間(s)
FGC 從應用程序啟動到采樣時old代(全gc)gc次數
FGCT 從應用程序啟動到采樣時old代(全gc)gc所用時間(s)
GCT 從應用程序啟動到采樣時gc用的總時間(s)

jstat -gccapacity <pid>:可以顯示VM內存中三代(young,old,perm)對象的使用和占用大小
NGCMN 年輕代(young)中初始化(最小)的大小(字節)
NGCMX 年輕代(young)的最大容量 (字節)
NGC 年輕代(young)中當前的容量 (字節)
S0C 年輕代中第一個survivor(幸存區)的容量 (字節)
S1C 年輕代中第二個survivor(幸存區)的容量 (字節)
EC 年輕代中Eden(伊甸園)的容量 (字節)
OGCMN old代中初始化(最小)的大小 (字節)
OGCMX old代的最大容量(字節)
OGC old代當前新生成的容量 (字節)
OC Old代的容量 (字節)
PGCMN perm代中初始化(最小)的大小 (字節)
PGCMX perm代的最大容量 (字節)
PGC perm代當前新生成的容量 (字節)
PC Perm(持久代)的容量 (字節)
YGC 從應用程序啟動到采樣時年輕代中gc次數
FGC 從應用程序啟動到采樣時old代(全gc)gc次數
jstat -gcutil <pid>:統計gc信息
S0 年輕代中第一個survivor(幸存區)已使用的占當前容量百分比
S1 年輕代中第二個survivor(幸存區)已使用的占當前容量百分比
E 年輕代中Eden(伊甸園)已使用的占當前容量百分比
O old代已使用的占當前容量百分比
P perm代已使用的占當前容量百分比
YGC 從應用程序啟動到采樣時年輕代中gc次數
YGCT 從應用程序啟動到采樣時年輕代中gc所用時間(s)
FGC 從應用程序啟動到采樣時old代(全gc)gc次數
FGCT 從應用程序啟動到采樣時old代(全gc)gc所用時間(s)
GCT 從應用程序啟動到采樣時gc用的總時間(s)
jstat -gcnew <pid>:年輕代對象的信息
S0C 年輕代中第一個survivor(幸存區)的容量 (字節)
S1C 年輕代中第二個survivor(幸存區)的容量 (字節)
S0U 年輕代中第一個survivor(幸存區)目前已使用空間 (字節)
S1U 年輕代中第二個survivor(幸存區)目前已使用空間 (字節)
TT 持有次數限制
MTT 最大持有次數限制
EC 年輕代中Eden(伊甸園)的容量 (字節)
EU 年輕代中Eden(伊甸園)目前已使用空間 (字節)
YGC 從應用程序啟動到采樣時年輕代中gc次數
YGCT 從應用程序啟動到采樣時年輕代中gc所用時間(s)
jstat -gcnewcapacity<pid>: 年輕代對象的信息及其占用量。
NGCMN 年輕代(young)中初始化(最小)的大小(字節)
NGCMX 年輕代(young)的最大容量 (字節)
NGC 年輕代(young)中當前的容量 (字節)
S0CMX 年輕代中第一個survivor(幸存區)的最大容量 (字節)
S0C 年輕代中第一個survivor(幸存區)的容量 (字節)
S1CMX 年輕代中第二個survivor(幸存區)的最大容量 (字節)
S1C 年輕代中第二個survivor(幸存區)的容量 (字節)
ECMX 年輕代中Eden(伊甸園)的最大容量 (字節)
EC 年輕代中Eden(伊甸園)的容量 (字節)
YGC 從應用程序啟動到采樣時年輕代中gc次數
FGC 從應用程序啟動到采樣時old代(全gc)gc次數
jstat -gcold <pid>:old代對象的信息。
PC Perm(持久代)的容量 (字節)
PU Perm(持久代)目前已使用空間 (字節)
OC Old代的容量 (字節)
OU Old代目前已使用空間 (字節)
YGC 從應用程序啟動到采樣時年輕代中gc次數
FGC 從應用程序啟動到采樣時old代(全gc)gc次數
FGCT 從應用程序啟動到采樣時old代(全gc)gc所用時間(s)
GCT 從應用程序啟動到采樣時gc用的總時間(s)
stat -gcoldcapacity <pid>: old代對象的信息及其占用量。
OGCMN old代中初始化(最小)的大小 (字節)
OGCMX old代的最大容量(字節)
OGC old代當前新生成的容量 (字節)
OC Old代的容量 (字節)
YGC 從應用程序啟動到采樣時年輕代中gc次數
FGC 從應用程序啟動到采樣時old代(全gc)gc次數
FGCT 從應用程序啟動到采樣時old代(全gc)gc所用時間(s)
GCT 從應用程序啟動到采樣時gc用的總時間(s)
jstat –gcpermcapacity <pid>: perm對象的信息及其占用量。
PGCMN perm代中初始化(最小)的大小 (字節)
PGCMX perm代的最大容量 (字節)
PGC perm代當前新生成的容量 (字節)
PC Perm(持久代)的容量 (字節)
YGC 從應用程序啟動到采樣時年輕代中gc次數
FGC 從應用程序啟動到采樣時old代(全gc)gc次數
FGCT 從應用程序啟動到采樣時old代(全gc)gc所用時間(s)
GCT 從應用程序啟動到采樣時gc用的總時間(s)
jstat -printcompilation <pid>:當前VM執行的信息。
Compiled 編譯任務的數目
Size 方法生成的字節碼的大小
Type 編譯類型
Method 類名和方法名用來標識編譯的方法。類名使用/做為一個命名空間分隔符。方法名是給定類中的方法。上述格式是由-XX:+PrintComplation選項進行設置的
jmap:生成堆轉儲快照
jmap是JDK自帶的工具軟件,主要用於打印指定Java過程(或核心文件,遠程調試服務器)的共享對象內存映射或堆內存細節。可以使用jmap生成堆轉儲
查看幫助:jmap -help

- 參數解釋
option參數詳解:
<no option> 如果使用不帶選項參數的jmap打印共享對象映射,將打印目標虛擬機中加載的每個共享對象的起始地址,映射大小以及共享對象文件的路徑全稱。
-dump:[live,]format=b,file=<filename> 以hprof二進制格式轉儲Java堆到指定filename的文件中。
live子選項是可選的。如果指定了live子選項,堆中只有活動的對象會被轉儲。想要瀏覽堆轉儲,你可以使用jhat (Java的堆分析工具)讀取生成的文件。
-finalizerinfo 打印等待終結的對象信息。
-heap 打印一個堆的摘要信息,包括使用的GC算法,堆配置信息和代明智堆的使用情況。 -histo[:live] 打印堆的柱狀圖。其中包括每一個Java類,對象數量,內存大小(單位:字節),完全限定的類名。打印的虛擬機內部的類名稱將帶有一個'*'替換。如果指定了live子選項,則只計算活動的對象。 -permstat 打印的Java堆內存的永久保存區域的類加載器的智能統計信息。對於每個類加載器而言,它的名稱 活躍度,地址,父類加載器,它所加載的類的數量和大小都會被打印。此外包含的字符串數量和大小也會被打印。
-F 強制模式。如果指定的PID沒有響應,請使用JMAP -dump或jmap -histo選項。此模式下,不支持live子選項。
-h 打印幫助信息。
-help 打印幫助信息。
-J<flag> 指定傳遞給運行jmap的JVM的參數。
- 常用指令
jmap -heap 31846 查看java堆(heap)使用情況
JVM version is 24.71-b01
using thread-local object allocation.
Parallel GC with 4 thread(s)//GC 方式
Heap Configuration: //堆內存初始化配置
MinHeapFreeRatio = 0 //對應jvm啟動參數-XX:MinHeapFreeRatio設置JVM堆最小空閑比率(default 40)
MaxHeapFreeRatio = 100 //對應jvm啟動參數 -XX:MaxHeapFreeRatio設置JVM堆最大空閑比率(default 70)
MaxHeapSize = 2082471936 (1986.0MB) //對應啟動參數-XX:MaxHeapSize=設置JVM堆的最大大小
NewSize = 1310720 (1.25MB)//對應jvm啟動參數-XX:NewSize=設置JVM堆的‘新生代’的默認大小
MaxNewSize = 17592186044415 MB//對應jvm啟動參數-XX:MaxNewSize=設置JVM堆的‘新生代’的最大大小
OldSize = 5439488 (5.1875MB)//對應jvm啟動參數-XX:OldSize=<value>:設置JVM堆的‘老生代’的大小
NewRatio = 2 //對應jvm啟動參數-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
SurvivorRatio = 8 //對應jvm啟動參數-XX:SurvivorRatio=設置年輕代中Eden區與Survivor區的大小比值
PermSize = 21757952 (20.75MB) //對應jvm啟動參數-XX:PermSize=<value>:設置JVM堆的‘永生代’的初始大小
MaxPermSize = 85983232 (82.0MB)//對應jvm啟動參數-XX:MaxPermSize=<value>:設置JVM堆的‘永生代’的最大大小
G1HeapRegionSize = 0 (0.0MB)
Heap Usage://堆內存使用情況
PS Young Generation
Eden Space://Eden區內存分布
capacity = 33030144 (31.5MB)//Eden區總容量
used = 1524040 (1.4534378051757812MB) //Eden區已使用
free = 31506104 (30.04656219482422MB) //Eden區剩余容量
4.614088270399305% used //Eden區使用比率
From Space: //其中一個Survivor區的內存分布
capacity = 5242880 (5.0MB)
used = 0 (0.0MB)
free = 5242880 (5.0MB)
0.0% used
To Space: //另一個Survivor區的內存分布
capacity = 5242880 (5.0MB)
used = 0 (0.0MB)
free = 5242880 (5.0MB)
0.0% used
PS Old Generation //當前的Old區內存分布
capacity = 86507520 (82.5MB)
used = 0 (0.0MB)
free = 86507520 (82.5MB)
0.0% used
PS Perm Generation//當前的 “永生代” 內存分布
capacity = 22020096 (21.0MB)
used = 2496528 (2.3808746337890625MB)
free = 19523568 (18.619125366210938MB)
11.337498256138392% used
670 interned Strings occupying 43720 bytes.

jmap -histo 3331 查看堆內存(直方圖)中的對象數量及大小
num #instances #bytes class name
編號 個數 字節 類名
----------------------------------------------
1: 7 1322080 [I
2: 5603 722368 <methodKlass>
3: 5603 641944 <constMethodKlass>
4: 34022 544352 java.lang.Integer
5: 371 437208 <constantPoolKlass>
6: 336 270624 <constantPoolCacheKlass>
7: 371 253816 <instanceKlassKlass>
jmap -histo:live這個命令執行,JVM會先觸發gc,然后再統計信息。

注:會按照byte大小 從大到小排序
jmap -dump:format=b,file=heapDump 6900 將要使用的內存的詳細情況輸出到文件
然后用jhat命令可以參見jhat -port 5000 heapDump在瀏覽器中訪問:http://localhost:5000/查看詳細信息
這個命令執行,JVM重新整堆堆的信息轉儲寫入一個文件,堆如果比較大的話,就會導致這個過程比較耗時,並且執行的過程中為了保證轉儲的信息是可靠的,所以會暫停應用。
- 總結
1.如果程序內存不足或經常GC,很有可能存在內存不足情況,這時候就要重新使用Java堆Dump查看對象的情況
2.要制作堆Dump可以直接使用jvm自帶的jmap命令
3.可以先使用jmap -heap命令查看堆的使用情況,看一下各個堆空間的占用情況。
4.使用jmap -histo:[live]查看堆內存中的對象的情況。如果有大量對象在持續被引用,並沒有被釋放掉,那就產生了內存泄露,就要結合代碼,把不用的對象釋放掉。
5.可以使用jmap -dump:format=b,file=<fileName>命令將堆信息保存到一個文件中,再借助與jhat命令查看詳細內容
6.在內存出現泄露,溢出或者其它前提條件下,建議多轉儲先前的內存,把內存文件進行編號擴展,並進行后續的內存整理分析
jhat:Java堆分析工具
jhat(Java堆分析工具),是一個用來分析java的堆情況的命令。使用jmap可以生成Java堆的Dump文件。生成轉儲文件之后就可以用jhat命令,將轉儲文件轉成html的形式,然后通過http訪問可以查看堆情況。
jhat命令解析會Java堆dump並啟動一個web服務器,然后就可以在瀏覽器中查看堆的dump文件了。
查看幫助: jhat -help

- 使用步驟
1,查看該進程的ID
jps
使用jps命令查看JAVA進程ID
2,生成轉儲文件
jmap -dump:format=b,file=heapDump 62247
3,解析Java堆轉儲文件,並啟動一個Web服務器
jhat heapDump
使用jhat命令,就啟動了一個http服務,端口是7000
然后在訪問 http://localhost:7000/
- 常用指令
jmap -dump:format=b,file=heapDump 3331 + jhat heapDump:解析Java堆轉儲文件,並啟動一個 web server
jstack:堆棧跟蹤工具
jstack是java虛擬機自帶的一種堆棧跟蹤工具
jstack用於生成java虛擬機當前時刻的線程快照。線程快照是當前java虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部資源導致的長時間等待等。 線程出現停頓的時候通過jstack來查看各個線程的調用堆棧,就可以知道沒有響應的線程到底在后台做什么事情,或者等待什么資源。 如果java程序崩潰生成core文件,jstack工具可以用來獲得core文件的java stack和native stack的信息,從而可以輕松地知道java程序是如何崩潰和在程序何處發生問題。另外,jstack工具還可以附屬到正在運行的java程序中,看到當時運行的java程序的java stack和native stack的信息, 如果現在運行的java程序呈現hung的狀態,jstack是非常有用的。
- 拓展知識
線程狀態
想要通過jstack命令來分析線程的情況的話,首先要知道線程都有哪些狀態,下面這些狀態是我們使用jstack命令查看線程堆棧信息時可能會看到的線程的幾種狀態:
NEW,未啟動的。不會出現在Dump中。
RUNNABLE,在虛擬機內執行的。
BLOCKED,受阻塞並等待監視器鎖。
WATING,無限期等待另一個線程執行特定操作。
TIMED_WATING,有時限的等待另一個線程的特定操作。
TERMINATED,已退出的。
調用修飾
表示線程在方法調用時,額外的重要的操作。線程Dump分析的重要信息。修飾上方的方法調用。
locked <地址> 目標:使用synchronized申請對象鎖成功,監視器的擁有者。
waiting to lock <地址> 目標:使用synchronized申請對象鎖未成功,在迚入區等待。
waiting on <地址> 目標:使用synchronized申請對象鎖成功后,釋放鎖幵在等待區等待。
parking to wait for <地址> 目標
- 常用指令
jstack 3331:查看線程情況
jstack -F 3331:正常輸出不被響應時,使用該指令
jstack -l 3331:除堆棧外,顯示關於鎖的附件信息
