-
什么时候用:
当服务发生GC问题时,一般会使用jmap工具进行分析.
-
有什么用:
- 查看堆各个对象的数量,大小
- dump堆里的对象信息,然后可以用MAT分析
- 查看堆的配置情况和GC算法
- 查看堆永久代信息
-
jmap命令
1. jmap -histo[:live] <pid>
通过histo选项,打印当前java堆中各个对象的数量、大小
如果添加了live,只会打印活跃的对象。
[root@wep-test01 ~]# ps -ef | grep java
root 5073 1 0 Jul01 ? 00:03:08 /usr/bin/java -Djava.util.logging.config.file=/root/apache-tomcat-7.0.72/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.endorsed.dirs=/root/apache-tomcat-7.0.72/endorsed -classpath /root/apache-tomcat-7.0.72/bin/bootstrap.jar:/root/apache-tomcat-7.0.72/bin/tomcat-juli.jar -Dcatalina.base=/root/apache-tomcat-7.0.72 -Dcatalina.home=/root/apache-tomcat-7.0.72 -Djava.io.tmpdir=/root/apache-tomcat-7.0.72/temp org.apache.catalina.startup.Bootstrap start
root 8663 21593 0 11:08 pts/0 00:00:00 grep java
[root@wep-test01 ~]# jmap -histo 5073 >jmap.dump
[root@wep-test01 ~]# more jmap.dump
num #instances #bytes class name
----------------------------------------------
1: 2444981 225646208 [C
2: 2081024 71506104 [Ljava.lang.Object;
3: 270146 61733488 [I
4: 322753 54584184 [B
5: 1567260 37614240 java.lang.String
6: 1117680 35765760 java.lang.StackTraceElement
7: 971887 31100384 org.apache.ibatis.reflection.property.PropertyTokenizer
8: 562589 22503560 java.util.TreeMap$Entry
9: 99923 17262624 [S
10: 862120 13793920 java.lang.Boolean
11: 216028 10369344 java.util.HashMap
12: 31784 9515032 [Ljava.lang.StackTraceElement;
13: 170012 8117672 [Ljava.lang.String;
14: 249881 5997144 java.util.ArrayList
15: 373275 5972400 java.lang.Integer
16: 60690 5717584 [Ljava.util.HashMap$Node;
17: 64035 5635080 java.lang.reflect.Method
18: 154234 4935488 java.util.HashMap$Node
19: 19996 4799040 oracle.jdbc.driver.T4CVarcharAccessor
20: 47811 3442392 org.apache.ibatis.ognl.OgnlContext
21: 151730 3140456 [Ljava.lang.Class;
22: 108599 2606376 java.lang.StringBuilder
23: 30601 2448080 java.lang.reflect.Constructor
24: 3584 2179072 com.qiku.model.bas.BasCustomer
25: 61979 1983328 java.sql.Timestamp
26: 27203 1958616 java.lang.reflect.Field
27: 8433 1888992 com.qiku.model.doc.DocAsnSubSerialNo
28: 19140 1837440 sun.util.calendar.Gregorian$Date
只打印活跃对象
[root@wep-test01 ~]# jmap -histo:live 5073 |more
num #instances #bytes class name
----------------------------------------------
1: 249323 28354272 [C
2: 7775 8678968 [B
3: 246164 5907936 java.lang.String
4: 63489 3610336 [Ljava.lang.Object;
5: 36345 3198360 java.lang.reflect.Method
6: 38337 2125152 [I
7: 8786 2108640 oracle.jdbc.driver.T4CVarcharAccessor
8: 57901 1852832 java.util.HashMap$Node
9: 70561 1693464 java.util.ArrayList
10: 11920 1371256 java.lang.Class
11: 40859 1307488 java.util.concurrent.ConcurrentHashMap$Node
12: 10695 1196464 [Ljava.util.HashMap$Node;
13: 33461 1070752 java.lang.ref.WeakReference
14: 12011 768704 java.net.URL
15: 13138 630624 java.util.HashMap
16: 14942 597680 java.lang.ref.SoftReference
17: 14758 590320 java.util.LinkedHashMap$Entry
18: 9978 558768 java.util.LinkedHashMap
2. jmap -dump:[live,]format=b,file=<filename> <pid>
通过-dump选项,把java堆中的对象dump到本地文件,然后使用MAT进行分析。
如果添加了live,只会dump活跃的对象。
[root@wep-test01 ~]# jmap -dump:format=b,file=jmap.dump1 5073
Dumping heap to /root/jmap.dump1 ...
Heap dump file created
[root@wep-test01 ~]# more jmap.dump1
ig;/io/Reader;)V is abstract0 Method oracle/jdbc/internal/OraclePreparedStatement.setTimestamp(ILjava/sql/Timestamp;)V is abstractetaDataalkerons/collection/AbstractCollectionDecorator/validation/constraints/NotNull$ListolvableTypeProvider;e;
'DATE' as type_name, rSize
ƀZLEXCOUNT
춽춾춿췀�췁췂췃췄췅췆췇췈췉췊췋���췌췍췎췏췐췑췒췓췔췕췖췗췘췙췚췛췜�췝췞췟췠췡췢췣췤췥췦췧���취췩췪췫췬췭췮췯췰췱췲췳췴췵췶췷췸�췹췺췻췼췽췾췿츀츁츂츃�
@STATE_BLOCKEDl/bind/v2/runtime/reflect/Accessor;)Lcom/sun/xml/bind/v2/runtime/reflect/PrimitiveArrayListerBoolean$BooleanArrayPack;/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlLeaveStatementva/lang/Object;>Ljava/lang/Object;Ljava/util/Iterator<TT;>;alizeConfig;
生成Heap Dump文件的方法:
JMAP(Java Memory Map)
方法一:让运行中的JVM生成Dump文件
/usr/java/jdk/bin/jmap -F -dump:format=b,file=/path/to/heap/dump/heap.bin PID
方法二:让JVM在遇到OOM(OutOfMemoryError)时生成Dump文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/heap/dump
用MAT分析Dump文件
MAT(Memory Analyzer)
http://www.eclipse.org/mat/
Mat是eclipse插件,要安装它.路径可到 http://www.eclipse.org/mat/downloads.php 找
如:http://download.eclipse.org/mat/1.8/update-site/
安装完插件后,eclipse的file菜单有个 Open Heap Dump
最后能生成一个很直观的图
见图:

3. jmap -heap <pid>
通过-heap选项,打印java堆的配置情况和使用情况,还有使用的GC算法。
[root@test01 ~]# jmap -heap 549
Attaching to process ID 549, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.79-b02
using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 4294967296 (4096.0MB)
NewSize = 2621440000 (2500.0MB)
MaxNewSize = 2621440000 (2500.0MB)
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 536870912 (512.0MB)
MaxPermSize = 1073741824 (1024.0MB)
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 2359296000 (2250.0MB)
used = 605297248 (577.2564392089844MB)
free = 1753998752 (1672.7435607910156MB)
25.65584174262153% used
Eden Space:
capacity = 2097152000 (2000.0MB)
used = 468670096 (446.95863342285156MB)
free = 1628481904 (1553.0413665771484MB)
22.34793167114258% used
From Space:
capacity = 262144000 (250.0MB)
used = 136627152 (130.2978057861328MB)
free = 125516848 (119.70219421386719MB)
52.11912231445312% used
To Space:
capacity = 262144000 (250.0MB)
used = 0 (0.0MB)
free = 262144000 (250.0MB)
0.0% used
concurrent mark-sweep generation:
capacity = 1673527296 (1596.0MB)
used = 95869752 (91.42852020263672MB)
free = 1577657544 (1504.5714797973633MB)
5.728604022721599% used
Perm Generation:
capacity = 536870912 (512.0MB)
used = 96785824 (92.30215454101562MB)
free = 440085088 (419.6978454589844MB)
18.027764558792114% used
33025 interned Strings occupying 3477008 bytes.
4. jmap -finalizerinfo <pid>
通过-finalizerinfo选项,打印那些正在等待执行finalize方法的对象。
[root@test01 ~]# jmap -finalizerinfo 549
Attaching to process ID 549, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.79-b02
Number of objects pending for finalization: 0
5. jmap -permstat <pid>
通过-permstat选项,打印java堆永久代的信息,包括class loader相关的信息,和interned Strings的信息。
运行时间有点长..............................
网友评论