jmap java opts_jmap --查看JVM内存使用详情
概述
命令jmap是一個多功能的命令。它可以生成 java 程序的 dump 文件, 也可以查看堆內(nèi)對象示例的統(tǒng)計信息、查看 ClassLoader 的信息以及 finalizer 隊列。
jmap命令是一個可以輸出所有內(nèi)存中對象的工具,甚至可以將VM 中的heap,以二進制輸出成文本。
打印出某個java進程(使用pid)內(nèi)存內(nèi)的,所有‘對象’的情況(如:產(chǎn)生那些對象,及其數(shù)量)。
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) 連接到遠(yuǎn)程調(diào)試服務(wù)
參數(shù):
option: 選項參數(shù)。
pid: 需要打印配置信息的進程ID。
executable: 產(chǎn)生核心dump的Java可執(zhí)行文件。
core: 需要打印配置信息的核心文件。
server-id 可選的唯一id,如果相同的遠(yuǎn)程主機上運行了多臺調(diào)試服務(wù)器,用此選項參數(shù)標(biāo)識服務(wù)器。
remote server IP or hostname 遠(yuǎn)程調(diào)試服務(wù)器的IP地址或主機名。
option
no option: 查看進程的內(nèi)存映像信息,類似 Solaris pmap 命令。
heap: 顯示Java堆詳細(xì)信息
histo[:live]: 顯示堆中對象的統(tǒng)計信息
clstats:打印類加載器信息
finalizerinfo: 顯示在F-Queue隊列等待Finalizer線程執(zhí)行finalizer方法的對象
dump::生成堆轉(zhuǎn)儲快照
F: 當(dāng)-dump沒有響應(yīng)時,使用-dump或者-histo參數(shù). 在這個模式下,live子參數(shù)無效.
help:打印幫助信息
J:指定傳遞給運行jmap的JVM的參數(shù)
3.參數(shù)說明
1) options:
> pid: 目標(biāo)進程的PID,進程編號,可以采用ps -ef | grep java 查看java進程的PID;
> executable: 產(chǎn)生core dump的java可執(zhí)行程序;
> core: 將被打印信息的core dump文件;
> remote-hostname-or-IP: 遠(yuǎn)程debug服務(wù)的主機名或ip;
> server-id: 唯一id,假如一臺主機上多個遠(yuǎn)程debug服務(wù);
2)基本參數(shù):
[就是替換[option]位置的參數(shù)]
1>? -dump:[live,]format=b,file=?使用hprof二進制形式,輸出jvm的heap內(nèi)容到文件=.? live子選項是可選的,假如指定live選項,那么只輸出活的對象到文件.
命令:
jmap -dump:live,format=b,file=myjmapfile.txt 19570
結(jié)果:
即可在/root目錄打開myjmapfile.txt文件。
當(dāng)然,file=后面也可以指定文件存放的目錄,就可以在指定目錄查看文件了。
2>? -finalizerinfo?打印正等候回收的對象的信息
命令:
jmap -finalizerinfo 3772
結(jié)果:
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堆內(nèi)存的使用情況.
命令:
jmap -heap 19570
結(jié)果:
解析:
using parallel threads inthe new generation. ##新生代采用的是并行線程處理方式
using thread-local objectallocation.
Concurrent Mark-Sweep GC ##同步并行垃圾回收
Heap Configuration: ##堆配置情況,也就是JVM參數(shù)配置的結(jié)果[平常說的tomcat配置JVM參數(shù),就是在配置這些]
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區(qū) 永久代大小
MaxPermSize= 134217728 (128.0MB) ##最大可分配perm區(qū) 也就是永久代大小
Heap Usage: ##堆使用情況【堆內(nèi)存實際的使用情況】
New Generation (Eden+ 1 Survivor Space): ##新生代(伊甸區(qū)Eden區(qū) + 幸存區(qū)survior(1+2)空間)
capacity= 241631232 (230.4375MB) ##伊甸區(qū)容量
used= 77776272 (74.17323303222656MB) ##已經(jīng)使用大小free = 163854960 (156.26426696777344MB) ##剩余容量32.188004570534986%used ##使用比例
Eden Space: ##伊甸區(qū)
capacity= 214827008 (204.875MB) ##伊甸區(qū)容量
used= 74442288 (70.99369812011719MB) ##伊甸區(qū)使用free = 140384720 (133.8813018798828MB) ##伊甸區(qū)當(dāng)前剩余容量34.65220164496263%used ##伊甸區(qū)使用情況
From Space: ##survior1區(qū)
capacity= 26804224 (25.5625MB) ##survior1區(qū)容量
used= 3333984 (3.179534912109375MB) ##surviror1區(qū)已使用情況free = 23470240 (22.382965087890625MB) ##surviror1區(qū)剩余容量12.43827838477995%used ##survior1區(qū)使用比例
To Space: ##survior2 區(qū)
capacity= 26804224 (25.5625MB) ##survior2區(qū)容量
used= 0 (0.0MB) ##survior2區(qū)已使用情況free = 26804224 (25.5625MB) ##survior2區(qū)剩余容量0.0%used ## survior2區(qū)使用比例
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區(qū)容量
used= 47303016 (45.111671447753906MB) ##perm區(qū)已使用容量free = 86914712 (82.8883285522461MB) ##perm區(qū)剩余容量35.24349331855774% used ##perm區(qū)使用比例
4>? -histo[:live]?打印每個class的實例數(shù)目,內(nèi)存占用,類全名信息.?VM的內(nèi)部類名字開頭會加上前綴”*”.?如果live子參數(shù)加上后,只統(tǒng)計活的對象數(shù)量.
命令:
jmap -histo:live 19570
結(jié)果:
num #instances(實例) #bytes(字節(jié)大小) 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進程的內(nèi)存heap輸出出來到outfile文件里,再配合MAT(內(nèi)存分析工具)。
5> -permstat?打印classload和jvm?heap長久層的信息.?包含每個classloader的名字,活潑性,地址,父classloader和加載的class數(shù)量.?另外,內(nèi)部String的數(shù)量和占用內(nèi)存數(shù)也會打印出來.
命令:
jmap -permstat 19570
結(jié)果:
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沒有相應(yīng)的時候使用-dump或者-histo參數(shù).?在這個模式下,live子參數(shù)無效.
7>? -h?|?-help?打印輔助信息
8>? -J?傳遞參數(shù)給jmap啟動的jvm.
示例一:no option
命令:jmap pid
描述:查看進程的內(nèi)存映像信息,類似 Solaris pmap 命令。
使用不帶選項參數(shù)的jmap打印共享對象映射,將會打印目標(biāo)虛擬機中加載的每個共享對象的起始地址、映射大小以及共享對象文件的路徑全稱。這與Solaris的pmap工具比較相似。
示例二:heap
命令:jmap -heap pid
描述:顯示Java堆詳細(xì)信息
打印一個堆的摘要信息,包括使用的GC算法、堆配置信息和各內(nèi)存區(qū)域內(nèi)存使用信息
示例三:histo[:live]
命令:jmap -histo:live pid
描述:顯示堆中對象的統(tǒng)計信息
其中包括每個Java類、對象數(shù)量、內(nèi)存大小(單位:字節(jié))、完全限定的類名。打印的虛擬機內(nèi)部的類名稱將會帶有一個’*’前綴。如果指定了live子選項,則只計算活動的對象。
示例四:clstats
命令:jmap -clstats pid
描述:打印類加載器信息
-clstats是-permstat的替代方案,在JDK8之前,-permstat用來打印類加載器的數(shù)據(jù)
打印Java堆內(nèi)存的永久保存區(qū)域的類加載器的智能統(tǒng)計信息。對于每個類加載器而言,它的名稱、活躍度、地址、父類加載器、它所加載的類的數(shù)量和大小都會被打印。此外,包含的字符串?dāng)?shù)量和大小也會被打印。
示例五:finalizerinfo
命令:jmap -finalizerinfo pid
描述:打印等待終結(jié)的對象信息
Number of objects pending for finalization: 0 說明當(dāng)前F-QUEUE隊列中并沒有等待Fializer線程執(zhí)行final
示例六:dump:
命令:jmap -dump:format=b,file=heapdump.phrof pid
描述:生成堆轉(zhuǎn)儲快照dump文件。
以hprof二進制格式轉(zhuǎn)儲Java堆到指定filename的文件中。live子選項是可選的。如果指定了live子選項,堆中只有活動的對象會被轉(zhuǎn)儲。想要瀏覽heap dump,你可以使用jhat(Java堆分析工具)讀取生成的文件。
這個命令執(zhí)行,JVM會將整個heap的信息dump寫入到一個文件,heap如果比較大的話,就會導(dǎo)致這個過程比較耗時,并且執(zhí)行的過程中為了保證dump的信息是可靠的,所以會暫停應(yīng)用, 線上系統(tǒng)慎用。
總結(jié)
以上是生活随笔為你收集整理的jmap java opts_jmap --查看JVM内存使用详情的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql awr flush_Orac
- 下一篇: 开源游戏机java模拟器_开源一个Flu