jps
jps主要用來輸出JVM進程狀態信息。
–m 輸出傳入main方法的參數
–l 輸出main類或Jar的全限名
–v 輸出傳入JVM的參數
[badm@vm6-sj1-pro-had-32-107 data]$ jps -m -l
5390 com.ocr.OCR 20170103 ./hy-tb-vehicle-attach-20190108 ./data/ocr_20170103
jmap
jdk安裝後會自帶一些小工具,jmap命令主要用於打印指定Java進程的共享對象內存映射或堆內存細節。
jmap命令可以獲得運行中的jvm的堆的快照,從而可以離線分析堆,以檢查內存泄漏,檢查一些嚴重影響性能的大對象的創建,檢查系統中什麼對象最多,各種對象所佔內存的大小等等。
JVM內存
大部分新對象在Eden Space上分配,當Eden Space滿了,則要用到Survivor Space來回收。YGC的算法是很快的。多次YGC之後,還存活的對象就會被移到Old Generation(old space)上,當Old Generation滿了的時候,就會FGC,FGC有通常比較慢。Permanent Space只要你在開始時分配了足夠大的空間,那它可以不用管。
合理減少對象進入老生代; Old Space可能會一直增長,有時沒有辦法避免不讓對象進入Old Space,當然也有一些程序是從來都不執行FGC的; 是不是盡全力防止對象進入老生代?顯然不是,有些對象如果長久存在在新生代裏,顯然加重了YGC的負擔,多次YGC之後仍然存活的對象顯然應該放到Old Space裏。
Old Space增長緩慢,FullGC次數少,FullGC的時間短(大部情況應該要在1秒內)。
常見錯誤
outOfMemoryError 年老代內存不足。
outOfMemoryError:PermGen Space 永久代內存不足。
outOfMemoryError:GC overhead limit exceed 垃圾回收時間佔用系統運行時間的98%或以上。
jamp 參數
–heap
–histo
–dump
jmap -heap pid
[badm@vm6-sj1-pro-had-32-107 h_chenliling]$ jmap -heap 53854
Attaching to process ID 53854, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.74-b02
using thread-local object allocation.
Parallel GC with 28 thread(s)
Heap Configuration: #堆內存初始化配置
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 16785604608 (16008.0MB) #JVM堆的最大大小
NewSize = 350224384 (334.0MB)
MaxNewSize = 5595201536 (5336.0MB) #設置JVM堆的‘新生代’的最大大小
OldSize = 700448768 (668.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB) #JVM堆的‘持久代’的初始大小
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB #JVM堆的‘持久代’的最大大小
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 155713536 (148.5MB)
used = 27457888 (26.185882568359375MB)
free = 128255648 (122.31411743164062MB)
17.63359095512416% used
From Space:
capacity = 6815744 (6.5MB)
used = 6620264 (6.313575744628906MB)
free = 195480 (0.18642425537109375MB)
97.13193453275241% used
To Space:
capacity = 8912896 (8.5MB)
used = 0 (0.0MB)
free = 8912896 (8.5MB)
0.0% used
PS Old Generation
capacity = 700448768 (668.0MB)
used = 110872024 (105.73580169677734MB)
free = 589576744 (562.2641983032227MB)
15.828712828858883% used
jmap -histo pid
說明:instances(實例數)、bytes(大小)、classs name(類名)。它基本是按照使用使用大小逆序排列的。
[badm@vm6-sj1-pro-had-32-107 h_chenliling]$ jmap -histo 1654 |head -50
num #instances #bytes class name
----------------------------------------------
1: 38142 281905240 [C
2: 13941 100597448 [B
3: 7698 35544272 [I
4: 119316 3818112 java.util.HashMap$Node
5: 4209 913152 [Ljava.util.HashMap$Node;
6: 26944 862208 java.util.concurrent.ConcurrentHashMap$Node
7: 31421 754104 java.lang.String
8: 7016 449024 java.util.concurrent.ConcurrentHashMap
9: 3503 377488 [Ljava.util.concurrent.ConcurrentHashMap$Node;
10: 935 318320 [Ljava.lang.String;
11: 4541 298088 [Ljava.lang.Object;
12: 5088 284928 java.util.LinkedHashMap
13: 5514 264672 java.util.HashMap
14: 7474 239168 java.util.concurrent.FutureTask
15: 2022 230600 java.lang.Class
16: 7476 179424 java.util.concurrent.LinkedBlockingQueue$Node
17: 7474 179376 com.ocr.OCR$1
18: 7474 179376 java.util.concurrent.Executors$RunnableAdapter
19: 1481 165872 java.net.SocksSocketImpl
20: 5059 161888 java.lang.ref.ReferenceQueue
class標識說明:
B 代表 byte
C 代表 char
D 代表 double
F 代表 float
I 代表 int
J 代表 long
Z 代表 boolean
前邊有 [ 代表數組, [I 就相當於 int[]
對象用 [L+ 類名錶示
jstack
jstack能得到運行java程序的java stack和native stack的信息。可以輕鬆得知當前線程的運行情況。
jstack
–F
–m
–l long listing. Prints additional information about locks
–h
jstack -l pid
[badm@vm6-sj1-pro-had-32-107 h_chenliling]$ jstack -l 53854
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.74-b02 mixed mode):
"Attach Listener" #54 daemon prio=9 os_prio=0 tid=0x00007f6794001000 nid=0x16bdb waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"pool-1-thread-3" #23 prio=5 os_prio=0 tid=0x00007f6858120000 nid=0x18993 runnable [0x00007f6798dca000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
- locked <0x00000003d9874440> (a java.io.BufferedInputStream)//被鎖代碼行
at sun.net.www.MeteredStream.read(MeteredStream.java:134)
- locked <0x00000003d9874c78> (a sun.net.www.http.KeepAliveStream)
at java.io.FilterInputStream.read(FilterInputStream.java:133) //被鎖代碼行
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3336)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3329)
at com.ocr.OCR.getFile(OCR.java:233)
at com.ocr.OCR.access$000(OCR.java:45)
at com.ocr.OCR$1.run(OCR.java:407)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Locked ownable synchronizers:
- <0x00000003d8b42678> (a java.util.concurrent.ThreadPoolExecutor$Worker)