java虚拟机监控_Java虚拟机监控工具
jmap主要用于打印指定Java進程的共享對象內存映射或堆內存細節.
jmap 使用幫助
jmap自帶使用幫助 jmap -h 直接輸出各個參數選項的使用方式.主要包含-heap,-histo,-dump,其中的-histo和-dump都都可以跟著live子選項,使用live去執行的話會先進行一次full gc,然后再輸出gc后結果,所以在線上環境慎用.Usage:
jmap [option]
(to connect to running process)
jmap [option]
(to connect to a core file)
jmap [option] [server_id@]
(to connect to remote debug server)
where is one of:
to print same info as Solaris pmap
-heap to print java heap summary
-histo[:live] to print histogram of java object heap; if the "live"
suboption is specified, only count live objects
-permstat to print permanent generation statistics
-finalizerinfo to print information on objects awaiting finalization
-dump: to dump java heap in hprof binary format
dump-options:
live dump only live objects; if not specified,
all objects in the heap are dumped.
format=b binary format
file= dump heap to
Example: jmap -dump:live,format=b,file=heap.bin
-F force. Use with -dump: or -histo
to force a heap dump or histogram when does not
respond. The "live" suboption is not supported
in this mode.
-h | -help to print this help message
-J to pass directly to the runtime system
jmap -heap
輸出的內容包括兩部分
1. Heap Configuration : JVM啟動堆大小的配置,為啟動中配置的參數或者是根據系統內容默認出來的
2. Heap Usage : 堆各個分代或者內存區塊的總大小和使用情況
例如我有個25477進程,輸入 jmap -heap 25477 則輸入如下Attaching to process ID 25477, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.80-b11
using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 1073741824 (1024.0MB)
NewSize = 536870912 (512.0MB)
MaxNewSize = 536870912 (512.0MB)
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 134217728 (128.0MB)
MaxPermSize = 134217728 (128.0MB)
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 483196928 (460.8125MB)
used = 212745000 (202.88944244384766MB)
free = 270451928 (257.92305755615234MB)
44.02863256614082% used
Eden Space:
capacity = 429522944 (409.625MB)
used = 203633784 (194.20030975341797MB)
free = 225889160 (215.42469024658203MB)
47.409291364886904% used
From Space:
capacity = 53673984 (51.1875MB)
used = 9111216 (8.689132690429688MB)
free = 44562768 (42.49836730957031MB)
16.975106599130036% used
To Space:
capacity = 53673984 (51.1875MB)
used = 0 (0.0MB)
free = 53673984 (51.1875MB)
0.0% used
concurrent mark-sweep generation:
capacity = 536870912 (512.0MB)
used = 277557408 (264.6993713378906MB)
free = 259313504 (247.30062866210938MB)
51.69909596443176% used
Perm Generation:
capacity = 134217728 (128.0MB)
used = 48057608 (45.83130645751953MB)
free = 86160120 (82.16869354248047MB)
35.805708169937134% used
17927 interned Strings occupying 1892528 bytes.
雖然能夠看出堆內存的情況,但是它只是瞬時的狀態,沒辦法觀測到持續的情況,對比下之前的jstat -gcutil 在持續觀測gc上面是沒什么優勢的.
jmap -histo
使用來觀察類實例數和內存占用
jmap -histo 9931 | head -13 輸出如下num #instances #bytes class name
----------------------------------------------
1: 14814780 699191240 [C
2: 14335720 344057280 java.lang.String
3: 4398584 211132032 xxx.xxx.HistoryDownExp
4: 257644 184529576 [B
5: 604994 80461232 [I
6: 593514 28488672 sun.misc.FloatingDecimal
7: 30586 26224032 [Ljava.lang.Object;
8: 828080 19873920 com.google.gson.reflect.TypeToken
9: 69164 9988392
10: 69164 8864912
從上面的輸出可以看出HistoryDownExp 有4398584 個實例,總共占用了211132032 bytes (211.35M),每個對象占用48bytes
上面的數據可以用來估算某些對象的內存占用情況,結合QPS等其他因素推算出應用每秒在Eden區所申請的內存大小,進而估算出Eden區大小和GC頻率的關系,這在調整分代大小是很有幫助的.
還有如果你覺得內存消耗有點大或者懷疑內存泄露可以使用histo選項來查看當前實例的創建情況,特別是用來看一些業務頭部類的創建情況.可準確地看到去優化哪塊代碼的對象創建.
jmap -dump
-histo只能看到實例數和大小,偏于簡單,需要更詳細的信息我們可以把整個JVM的堆dump出來然后使用工具進行分析,如下面的命令,dump出來的是一個二進制的文檔jmap -dump:format=b,file=/tmp/java.9931.hprof 9931
一般情況是我比較喜歡使用MAT來看,VisualVM也可以,當然VisualVM的功能遠非如此,我們可以后續探討.
MAT 全稱 MemoryAnalyzer tools 下載地址 https://www.eclipse.org/mat/
打開工具后可以通過File-> Open Heap Dump 來加載dump文檔,如上面命令dump出來的 java.9931.hprof
開始是一個overview,很清楚地列出了占用內存最多的類,以及相關引用的實例.可以點擊餅圖區域調出菜單,選list objects 能看到該類的實例的引用情況.
功能還有很多,可以看看官方文檔.
HeapDumpOnOutOfMemoryError
上面介紹的方法都是人為在排查問題的時候主動輸入命令去分析的,但是如果是夜深人靜的時候發生了內存溢出,這時候我們沒有提前發現,現場沒有保留.
JVM有個選項 -XX:+HeapDumpOnOutOfMemoryError 加上后,發生 OutOfMemoryError 的時候會在運行目錄下dump出JVM內存的情況.然后就可以使用MAT進行分析了
總結
以上是生活随笔為你收集整理的java虚拟机监控_Java虚拟机监控工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java判断类型_Java中类型判断的几
- 下一篇: 小米5x内存卡支持256GB,再也不用担