一,jps
jps命令选项如下:
-q 可以输出进程id
-m 输出传入main方法的参数
-l 输出main类或Jar的全限名
-v 输出传入JVM的参数
实例:
C:\Users\WWH>jps -q
18000
6288
2780
//运行了一个main方法后输出结果如下:
C:\Users\WWH>jps -q
18000
6288
6848
11460
C:\Users\WWH>jps -m
18000 Test
6288
8224 Jps -m
11460 Test
C:\Users\WWH>jps -l
18000 test.Test
3952 sun.tools.jps.Jps
6288
11460 test.Test
C:\Users\WWH>jps -v
18000 Test -Dfile.encoding=UTF-8
6288 -Dosgi.requiredJavaVersion=1.8 -Dosgi.instance.area.default=@user.home/eclipse-workspace -XX:+UseG1GC -XX:+UseStringDeduplication -Dosgi.requiredJavaVersion=1.8 -Xms256m -Xmx1024m
二,jmap
1,-heap 打印Java堆概要信息,包括使用的GC算法、堆配置参数和各代中堆内存使用情况;
选择运行一个main方法的Test进程的id运行:
C:\Users\WWH>jmap -heap 18000
Attaching to process ID 18000, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 25.131-b11
using thread-local object allocation.
Mark Sweep Compact GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 268435456 (256.0MB)
NewSize = 5570560 (5.3125MB)
MaxNewSize = 89456640 (85.3125MB)
OldSize = 11206656 (10.6875MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 12582912 (12.0MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 4294901760 (4095.9375MB)
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 5046272 (4.8125MB)
used = 906416 (0.8644256591796875MB)
free = 4139856 (3.9480743408203125MB)
17.962091619318183% used
Eden Space:
capacity = 4521984 (4.3125MB)
used = 906416 (0.8644256591796875MB)
free = 3615568 (3.4480743408203125MB)
20.044652966485508% used
From Space:
capacity = 524288 (0.5MB)
used = 0 (0.0MB)
free = 524288 (0.5MB)
0.0% used
To Space:
capacity = 524288 (0.5MB)
used = 0 (0.0MB)
free = 524288 (0.5MB)
0.0% used
tenured generation:
capacity = 11206656 (10.6875MB)
used = 0 (0.0MB)
free = 11206656 (10.6875MB)
0.0% used
1619 interned Strings occupying 129048 bytes.
2,-histo[:live] 打印Java堆中对象直方图,通过该图可以获取每个class的对象数目,占用内存大小和类全名信息,带上:live,则只统计活着的对象,如下命令:
num #instances #bytes class name
----------------------------------------------
1: 2302 303296 [C
2: 505 49472 java.lang.Class
3: 2160 34560 java.lang.String
4: 536 29224 [Ljava.lang.Object;
5: 840 26880 java.util.TreeMap$Entry
6: 15 25072 [B
7: 196 7328 [Ljava.lang.String;
8: 82 5248 java.net.URL
9: 79 5056 java.lang.reflect.Field
10: 256 4096 java.lang.Integer
11: 93 3616 [I
12: 97 3104 java.lang.ref.SoftReference
13: 113 2712 java.util.Hashtable$Entry
14: 103 2472 java.util.HashMap$Node
15: 5 1880 java.lang.Thread
16: 13 1808 [Ljava.util.HashMap$Node;
17: 48 1536 java.util.LinkedHashMap$Entry
18: 38 1520 sun.util.locale.LocaleObjectCache$CacheEntry
19: 30 1440 sun.misc.URLClassPath$JarLoader
20: 18 1296 java.lang.reflect.Constructor
21: 48 1152 java.io.ExpiringCache$Entry
22: 45 1080 java.util.concurrent.ConcurrentHashMap$Node
23: 2 1064 [Ljava.lang.invoke.MethodHandle;
24: 1 1040 [Ljava.lang.Integer;
25: 1 1040 [[C
26: 6 960 [Ljava.util.Hashtable$Entry;
27: 18 864 java.lang.Class$ReflectionData
28: 26 832 java.io.ObjectStreamField
29: 9 720 [Ljava.util.WeakHashMap$Entry;
30: 17 680 java.util.HashMap
31: 8 640 [S
32: 19 608 sun.util.locale.BaseLocale
33: 19 608 sun.util.locale.BaseLocale$Key
34: 5 528 [Ljava.util.concurrent.ConcurrentHashMap$Node;
35: 15 480 java.lang.ref.Finalizer
..........
3,-finalizerinfo 打印等待回收的对象信息,如下命令:
C:\Users\WWH>jmap -finalizerinfo 18000
Attaching to process ID 18000, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 25.131-b11
Number of objects pending for finalization: 0
Number of objects pending for finalization: 0 说明当前F-QUEUE队列中并没有等待Fializer线程执行finalizer方法的对象。
4,-dump: 以hprof二进制格式将Java堆信息输出到文件内,该文件可以用MAT、VisualVM或jhat等工具查看;
dump-options选项:
live 只输出活着的对象;不指定,则输出堆中所有对象
format=b 指定输出格式为二进制
file= 指定文件名及文件存储位置,例如:jmap -dump:live,format=b,file=D:\heap.bin
-F 与-dump: 或-histo一起使用,当没有响应时,强制执行;
运行如下:
C:\Users\WWH>jmap -dump:live,format=b,file=G:\heap.bin 18000
Dumping heap to G:\heap.bin ...
Heap dump file created