jmap java opts_jmap --查看JVM内存使用详情
概述
命令jmap是一個多功能的命令。它可以生成 java 程序的 dump 文件, 也可以查看堆內對象示例的統計信息、查看 ClassLoader 的信息以及 finalizer 隊列。
jmap命令是一個可以輸出所有內存中對象的工具,甚至可以將VM 中的heap,以二進制輸出成文本。
打印出某個java進程(使用pid)內存內的,所有‘對象’的情況(如:產生那些對象,及其數量)。
64位機上使用需要使用如下方式:
jmap -J-d64 -heap pid
jmap 用法
jmap [option] (to connect to running process) 連接到正在運行的進程
jmap [option](to connect to a corefile) 連接到核心文件
jmap [option] [server_id@](to connect to remote debug server) 連接到遠程調試服務
參數:
option: 選項參數。
pid: 需要打印配置信息的進程ID。
executable: 產生核心dump的Java可執行文件。
core: 需要打印配置信息的核心文件。
server-id 可選的唯一id,如果相同的遠程主機上運行了多臺調試服務器,用此選項參數標識服務器。
remote server IP or hostname 遠程調試服務器的IP地址或主機名。
option
no option: 查看進程的內存映像信息,類似 Solaris pmap 命令。
heap: 顯示Java堆詳細信息
histo[:live]: 顯示堆中對象的統計信息
clstats:打印類加載器信息
finalizerinfo: 顯示在F-Queue隊列等待Finalizer線程執行finalizer方法的對象
dump::生成堆轉儲快照
F: 當-dump沒有響應時,使用-dump或者-histo參數. 在這個模式下,live子參數無效.
help:打印幫助信息
J:指定傳遞給運行jmap的JVM的參數
3.參數說明
1) options:
> pid: 目標進程的PID,進程編號,可以采用ps -ef | grep java 查看java進程的PID;
> executable: 產生core dump的java可執行程序;
> core: 將被打印信息的core dump文件;
> remote-hostname-or-IP: 遠程debug服務的主機名或ip;
> server-id: 唯一id,假如一臺主機上多個遠程debug服務;
2)基本參數:
[就是替換[option]位置的參數]
1>? -dump:[live,]format=b,file=?使用hprof二進制形式,輸出jvm的heap內容到文件=.? live子選項是可選的,假如指定live選項,那么只輸出活的對象到文件.
命令:
jmap -dump:live,format=b,file=myjmapfile.txt 19570
結果:
即可在/root目錄打開myjmapfile.txt文件。
當然,file=后面也可以指定文件存放的目錄,就可以在指定目錄查看文件了。
2>? -finalizerinfo?打印正等候回收的對象的信息
命令:
jmap -finalizerinfo 3772
結果:
Attaching to process ID 19570, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.80-b11
Number of objects pending for finalization: 0 (等候回收的對象為0個)
3>? -heap?打印heap的概要信息,GC使用的算法,heap(堆)的配置及JVM堆內存的使用情況.
命令:
jmap -heap 19570
結果:
解析:
using parallel threads inthe new generation. ##新生代采用的是并行線程處理方式
using thread-local objectallocation.
Concurrent Mark-Sweep GC ##同步并行垃圾回收
Heap Configuration: ##堆配置情況,也就是JVM參數配置的結果[平常說的tomcat配置JVM參數,就是在配置這些]
MinHeapFreeRatio= 40##最小堆使用比例
MaxHeapFreeRatio= 70##最大堆可用比例
MaxHeapSize= 2147483648 (2048.0MB) ##最大堆空間大小
NewSize= 268435456 (256.0MB) ##新生代分配大小
MaxNewSize= 268435456 (256.0MB) ##最大可新生代分配大小
OldSize= 5439488 (5.1875MB) ##老年代大小
NewRatio= 2##新生代比例
SurvivorRatio= 8##新生代與suvivor的比例
PermSize= 134217728 (128.0MB) ##perm區 永久代大小
MaxPermSize= 134217728 (128.0MB) ##最大可分配perm區 也就是永久代大小
Heap Usage: ##堆使用情況【堆內存實際的使用情況】
New Generation (Eden+ 1 Survivor Space): ##新生代(伊甸區Eden區 + 幸存區survior(1+2)空間)
capacity= 241631232 (230.4375MB) ##伊甸區容量
used= 77776272 (74.17323303222656MB) ##已經使用大小free = 163854960 (156.26426696777344MB) ##剩余容量32.188004570534986%used ##使用比例
Eden Space: ##伊甸區
capacity= 214827008 (204.875MB) ##伊甸區容量
used= 74442288 (70.99369812011719MB) ##伊甸區使用free = 140384720 (133.8813018798828MB) ##伊甸區當前剩余容量34.65220164496263%used ##伊甸區使用情況
From Space: ##survior1區
capacity= 26804224 (25.5625MB) ##survior1區容量
used= 3333984 (3.179534912109375MB) ##surviror1區已使用情況free = 23470240 (22.382965087890625MB) ##surviror1區剩余容量12.43827838477995%used ##survior1區使用比例
To Space: ##survior2 區
capacity= 26804224 (25.5625MB) ##survior2區容量
used= 0 (0.0MB) ##survior2區已使用情況free = 26804224 (25.5625MB) ##survior2區剩余容量0.0%used ## survior2區使用比例
PS Old Generation: ##老年代使用情況
capacity= 1879048192 (1792.0MB) ##老年代容量
used= 30847928 (29.41887664794922MB) ##老年代已使用容量free = 1848200264 (1762.5811233520508MB) ##老年代剩余容量1.6416783843721663%used ##老年代使用比例
Perm Generation: ##永久代使用情況
capacity= 134217728 (128.0MB) ##perm區容量
used= 47303016 (45.111671447753906MB) ##perm區已使用容量free = 86914712 (82.8883285522461MB) ##perm區剩余容量35.24349331855774% used ##perm區使用比例
4>? -histo[:live]?打印每個class的實例數目,內存占用,類全名信息.?VM的內部類名字開頭會加上前綴”*”.?如果live子參數加上后,只統計活的對象數量.
命令:
jmap -histo:live 19570
結果:
num #instances(實例) #bytes(字節大小) class name(類名)----------------------------------------------
1: 65220 9755240
2: 65220 8880384
3: 11721 8252112[B4: 6300 6784040
5: 75224 6218208[C6: 93969 5163280
7: 6300 4854440
8: 5482 4203152
9: 72097 2307104java.lang.String10: 15102 2289912[I11: 4089 2227728
12: 28887 1386576org.apache.velocity.runtime.parser.Token13: 6792 706368java.lang.Class14: 7445 638312[Ljava.util.HashMap$Entry;4380: 1 16com.sun.proxy.$Proxy2084381: 1 16sun.reflect.GeneratedMethodAccessor1984382: 1 16com.sun.proxy.$Proxy464383: 1 16org.apache.ibatis.ognl.SetPropertyAccessor4384: 1 16oracle.jdbc.driver.OracleDriver4385: 1 16com.sun.proxy.$Proxy1814386: 1 16com.sun.proxy.$Proxy824387: 1 16java.util.jar.JavaUtilJarAccessImpl4388: 1 16com.sun.proxy.$Proxy1714389: 1 16sun.reflect.GeneratedMethodAccessor1364390: 1 16sun.reflect.GeneratedConstructorAccessor224391: 1 16org.elasticsearch.action.search.SearchAction4392: 1 16org.springframework.core.annotation.AnnotationAwareOrderComparator
Total1756265 162523736
采用jmap?-histo?pid>a.log日志將其保存,在一段時間后,使用文本對比工具,可以對比出GC回收了哪些對象。
jmap?-dump:format=b,file=outfile?3024可以將3024進程的內存heap輸出出來到outfile文件里,再配合MAT(內存分析工具)。
5> -permstat?打印classload和jvm?heap長久層的信息.?包含每個classloader的名字,活潑性,地址,父classloader和加載的class數量.?另外,內部String的數量和占用內存數也會打印出來.
命令:
jmap -permstat 19570
結果:
Attaching to process ID 19570, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is24.80-b11
finding class loader instances ..done.
computing per loaderstat ..done.
pleasewait.. computing liveness.liveness analysis may be inaccurate ...
class_loader classes bytes parent_loader alive?type 2538 14654264 null live
0x000000070af968c8 63 399160 0x0000000707db1788 dead org/apache/catalina/loader/WebappClassLoader@0x000000070367d2a8
0x000000070cba7b08 1 3064 0x0000000707e709a8 dead sun/reflect/DelegatingClassLoader@0x0000000702a50b98
0x000000070cba6a38 28 221344 0x0000000707e709a8 dead org/apache/jasperrvlet/JasperLoader@0x0000000705b11878
0x000000070baed8b8 32 297296 0x0000000707e709a8 dead org/apache/jasperrvlet/JasperLoader@0x0000000705b11878
0x000000070919a610 1 3056 0x0000000707e709a8 dead sun/reflect/DelegatingClassLoader@0x0000000702a50b98
0x000000070bdd1e18 1 3064 0x0000000707e709a8 dead sun/reflect/DelegatingClassLoader@0x0000000702a50b98
0x0000000707f1d480 1 3072 null dead sun/reflect/DelegatingClassLoader@0x0000000702a50b98
0x000000070cba7f48 1 1912 0x0000000707e709a8 dead sun/reflect/DelegatingClassLoader@0x0000000702a50b98
0x000000070cba8508 1 3064 0x0000000707e709a8 dead sun/reflect/DelegatingClassLoader@0x0000000702a50b98
0x000000070cba6c40 1 3064 0x0000000707e709a8 dead sun/reflect/DelegatingClassLoader@0x0000000702a50b98
0x000000070bd4c6a0 1 3056 null dead sun/reflect/DelegatingClassLoader@0x0000000702a50b98
0x000000070cba62b0 28 235472 0x0000000707e709a8 dead org/apache/jasperrvlet/JasperLoader@0x0000000705b11878
0x000000070cba77c8 1 3064 0x0000000707e709a8 dead sun/reflect/DelegatingClassLoader@0x0000000702a50b98
0x000000070cba7388 1 3064 0x0000000707e709a8 dead sun/reflect/DelegatingClassLoader@0x0000000702a50b98
0x000000070cba8148 1 3064 0x0000000707e709a8 dead sun/reflect/DelegatingClassLoader@0x0000000702a50b98
0x000000070afd8b60 1 6704 0x0000000707db1788 dead org/apache/catalina/loader/WebappClassLoader@0x000000070367d2a8
0x000000070919a410 1 1888 null dead sun/reflect/DelegatingClassLoader@0x0000000702a50b98
0x000000070bdd05b0 1 1912 null dead sun/reflect/DelegatingClassLoader@0x0000000702a50b98
0x000000070bc848b8 1 3088 0x0000000707db1788 dead sun/reflect/DelegatingClassLoader@0x0000000702a50b98
0x000000070cba64e8 1 1888 0x0000000707e709a8 dead sun/reflect/DelegatingClassLoader@0x0000000702a50b98
0x0000000707f1d2c0 1 3064 0x0000000707db1788 dead sun/reflect/DelegatingClassLoader@0x0000000702a50b98
0x000000070be82e38 1 1912 null dead sun/reflect/DelegatingClassLoader@0x0000000702a50b98
0x000000070cba7908 1 3208 null dead sun/reflect/DelegatingClassLoader@0x0000000702a50b98.........
total= 273 12995 87547304 N/A alive=1, dead=272 N/A
6>? -F?強迫.在pid沒有相應的時候使用-dump或者-histo參數.?在這個模式下,live子參數無效.
7>? -h?|?-help?打印輔助信息
8>? -J?傳遞參數給jmap啟動的jvm.
示例一:no option
命令:jmap pid
描述:查看進程的內存映像信息,類似 Solaris pmap 命令。
使用不帶選項參數的jmap打印共享對象映射,將會打印目標虛擬機中加載的每個共享對象的起始地址、映射大小以及共享對象文件的路徑全稱。這與Solaris的pmap工具比較相似。
示例二:heap
命令:jmap -heap pid
描述:顯示Java堆詳細信息
打印一個堆的摘要信息,包括使用的GC算法、堆配置信息和各內存區域內存使用信息
示例三:histo[:live]
命令:jmap -histo:live pid
描述:顯示堆中對象的統計信息
其中包括每個Java類、對象數量、內存大小(單位:字節)、完全限定的類名。打印的虛擬機內部的類名稱將會帶有一個’*’前綴。如果指定了live子選項,則只計算活動的對象。
示例四:clstats
命令:jmap -clstats pid
描述:打印類加載器信息
-clstats是-permstat的替代方案,在JDK8之前,-permstat用來打印類加載器的數據
打印Java堆內存的永久保存區域的類加載器的智能統計信息。對于每個類加載器而言,它的名稱、活躍度、地址、父類加載器、它所加載的類的數量和大小都會被打印。此外,包含的字符串數量和大小也會被打印。
示例五:finalizerinfo
命令:jmap -finalizerinfo pid
描述:打印等待終結的對象信息
Number of objects pending for finalization: 0 說明當前F-QUEUE隊列中并沒有等待Fializer線程執行final
示例六:dump:
命令:jmap -dump:format=b,file=heapdump.phrof pid
描述:生成堆轉儲快照dump文件。
以hprof二進制格式轉儲Java堆到指定filename的文件中。live子選項是可選的。如果指定了live子選項,堆中只有活動的對象會被轉儲。想要瀏覽heap dump,你可以使用jhat(Java堆分析工具)讀取生成的文件。
這個命令執行,JVM會將整個heap的信息dump寫入到一個文件,heap如果比較大的話,就會導致這個過程比較耗時,并且執行的過程中為了保證dump的信息是可靠的,所以會暫停應用, 線上系統慎用。
總結
以上是生活随笔為你收集整理的jmap java opts_jmap --查看JVM内存使用详情的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql awr flush_Orac
- 下一篇: 开源游戏机java模拟器_开源一个Flu