概述
无监控、不调优
jps:查看正在进行的java进程
Java Process Status
jps [options] | [hostid]
-q:仅仅显示LVMID(Local virtual machine id)
-l:输出应用程序主类的全类名
-m:输出虚拟机进程启动时传递给main()的参数
-v:列出虚拟机进程启动的JVM参数
jstat:查看JVM统计信息
JVM Statistics Monitoring Tool
监视虚拟机各种运行状态信息。显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等问题
类加载相关的:
-class:显示ClassLoader的相关信息
每隔1000ms打印一次
一共打印10次
-t 显示程序运行时间
每隔3条数据打印一个表头
垃圾回收相关的:
-gc:显示GC相关的堆信息
-gccapacity:显示内容与-gc相同,主要关注Java堆各个区域使用到的最大最小空间
-gcutil:显示内容与-gc相同,主要关注已使用空间占总空间的百分比
-gccause:和-gcutil功能一样,会额外输出导致最后一次或者当前正在发生GC的原因
-gcnew:显示新生代GC情况
-gcnewcapacity:与-gcnew相同,输出主要关注使用到的最大最小空间
-gcold:显示老年代GC情况
-gcoldcapacity:与-gcold相同,主要关注使用到的最大最小空间
-gcpermcapacity:显示永久代使用到的最大最小空间
JIT相关的:
-compiler:显示JIT编译器编译过的方法、耗时等信息
-printcompilation:输出已经被JIT编译的方法
补充:
- 比较Java进程的启动时间以及总GC时间(GCT列),或者两次测量的间隔时间以及总GC时间的增量,来得出GC时间占运行时间的比例。如果该比例超过20%,则表明堆的压力比较大;如果该比例超过90%,说明堆中几乎没有可用空间,随时可能抛出OOM异常。
- 长时间运行的Java程序中,可以运行jstat命令连续获取多行性能数据,并取这几行数据的OU列(已占用的老年代内存)的最小值。每个一段时间重复上述行为获取多组OU值,如果这个值呈上涨趋势,说明该Java程序的老年代内存已使用量在不断上涨,意味着无法回收的对象越来越多,有可能存在内存泄露。
jinfo:实时查看和修改JVM配置参数
Configuration Info for Java ,查看虚拟机配置参数信息、也可用于调整虚拟机的配置参数
-sysprops:所有参数
-flags:赋过值的参数
-flag:修改参数
java -XX:+PrintFlagsInitial:查看JVM参数启动的初始值
java -XX:+PrintFlagsFinal:查看所有JVM参数的最终值
java -XX:+PrintCommandLineFlags:查看已经被用户或者JVM设置过的详细的xx参数的名称和取值
jmap:导出内存映射文件和内存使用情况
JVM Memory Map
-dump:生成堆转储快照(dump)文件
-heap:输出堆空间的详细信息
-histo:输出堆中对象的统计信息
-perstat:输出永久代的内存状态信息
-finalizerinfo:显示在F-Queue中等待Finalizer线程执行finalize方法的对象
-F:强制生成dump文件
-
导出映像文件
手动方式
jmap -dump:format=b,file=d:1.hprof PID
jmap -dump:live,format=b,file=d:1.hprof PID 存活对象
自动方式
-XX:+HeapDumpOnOutOfMemoryError 发生OOM时导出dump文件
-XX:+HeapDumpPath = file.name -
显示堆内存相关信息(某时刻)
jmap -heap pid
Attaching to process ID 10524, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 62914560 (60.0MB)
NewSize = 20971520 (20.0MB)
MaxNewSize = 20971520 (20.0MB)
OldSize = 41943040 (40.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 16777216 (16.0MB)
used = 5163096 (4.923912048339844MB)
free = 11614120 (11.076087951660156MB)
30.774450302124023% used
From Space:
capacity = 2097152 (2.0MB)
used = 0 (0.0MB)
free = 2097152 (2.0MB)
0.0% used
To Space:
capacity = 2097152 (2.0MB)
used = 0 (0.0MB)
free = 2097152 (2.0MB)
0.0% used
PS Old Generation
capacity = 41943040 (40.0MB)
used = 31014080 (29.57733154296875MB)
free = 10928960 (10.42266845703125MB)
73.94332885742188% used
3163 interned Strings occupying 259488 bytes.
jmap -histo pid
部分内容
num #instances #bytes class name
----------------------------------------------
1: 1311 12197632 [B
2: 7865 947464 [C
3: 732 549728 [I
4: 6037 144888 java.lang.String
5: 736 83928 java.lang.Class
6: 1321 63704 [Ljava.lang.Object;
7: 791 31640 java.util.TreeMap$Entry
8: 628 25120 java.util.LinkedHashMap$Entry
9: 462 22336 [Ljava.lang.String;
10: 369 11808 java.util.HashMap$Node
11: 39 11664 [Ljava.util.HashMap$Node;
12: 152 10944 java.lang.reflect.Field
13: 434 10416 java.lang.StringBuilder
14: 275 8800 java.util.Hashtable$Entry
15: 232 7424 java.io.File
16: 101 6464 java.net.URL
17: 241 5784 java.lang.StringBuffer
18: 125 5000 java.lang.ref.SoftReference
19: 31 4224 [Ljava.util.Hashtable$Entry;
20: 258 4128 java.lang.Integer
21: 119 3808 java.util.concurrent.ConcurrentHashMap$Node
22: 72 3456 java.nio.HeapCharBuffer
23: 71 3408 java.nio.HeapByteBuffer
24: 42 3360 [S
25: 7 2632 java.lang.Thread
26: 20 2496 [Ljava.util.concurrent.ConcurrentHashMap$Node;
27: 44 2464 sun.misc.URLClassPath$JarLoader
28: 5 2408 [J
29: 2 2384 [[Ljava.lang.Object;
30: 89 2136 java.net.Parts
31: 2 2080 [[C
32: 26 2080 java.lang.reflect.Constructor
33: 41 1968 java.util.HashMap
34: 39 1872 sun.util.locale.LocaleObjectCache$CacheEntry
35: 45 1800 java.lang.ref.Finalizer
36: 1 1568 [[B
37: 37 1480 java.io.ObjectStreamField
38: 92 1472 java.lang.Object
39: 26 1456 java.lang.Class$ReflectionData
40: 21 1344 java.util.concurrent.ConcurrentHashMap
41: 15 1200 [Ljava.util.WeakHashMap$Entry;
42: 12 1152 java.util.jar.JarFile$JarFileEntry
43: 45 1080 sun.misc.URLClassPath$3
44: 2 1064 [Ljava.lang.invoke.MethodHandle;
45: 1 1040 [Ljava.lang.Integer;
46: 41 984 java.io.ExpiringCache$Entry
47: 12 960 java.util.zip.ZipEntry
48: 22 880 sun.util.locale.BaseLocale$Key
49: 47 840 [Ljava.lang.Class;
50: 15 840 sun.nio.cs.UTF_8$Encoder
51: 33 792 sun.security.action.GetPropertyAction
52: 12 768 java.util.jar.JarFile
53: 12 752 [Ljava.lang.reflect.Field;
54: 13 728 java.util.zip.ZipFile$ZipFileInputStream
55: 15 720 java.util.WeakHashMap
56: 18 720 java.util.WeakHashMap$Entry
57: 22 704 java.lang.ref.ReferenceQueue
58: 27 648 java.util.ArrayList
Total 24282 14246072
jmap导出的堆快照要是安全点位置的
jhat:JDK自带堆分析工具
JVM Heap Analysis Tool
jmpa生成dump文件,jhat分析dump文件
jstack:打印JVM中线程快照
JVM Stack Trace 看导致线程长时间停顿的原因
Thread dump中要留意的几种状态
- 死锁(deadLock)
- 等待资源(waiting on condition)
- 等待获取监视器(Waiting on monitor entry)
- 阻塞(Blocked)
- 执行中(Runnable)
- 暂停(Suspended)
- 对象等待中(wait)
- 停止(Parked)
-F:强制输出
-l:显示锁的附加信息
jcmd:多功能命令行
-l 列出所有JVM进程
pid help 针对指定进程哪些指令可以使用
pid + 具体命令 显示指定进程的指令命令数据