第一次写文章,大多都是网上摘抄的资料,如有侵权,联系立删
一、JVisualVM
是JDK自带的图形化工具,但需要安装插件Visual Gc, MBeans, 并且现场可能不支持远程查看,具体页面如下
二、jstat(Java Virtual Machine Statistics Monitoring Tools)
2.1 jps: 查看java进程
需要先用 jps 查看目前的java进程,主要是获得pid
2.2 jstat:统计java进程信息
可以用 jstat -options
查看jstat 的使用参数,但版本不同可能没后面的详情信息
+-----------------+---------------------------------------------------------------+
| Option | Displays... |
+-----------------+---------------------------------------------------------------+
|class | Statistics on the behavior of the class loader |
|compiler | Statistics on the behavior of the HotSpot Just-In-Time com- |
| | piler |
|gc | Statistics on the behavior of the garbage collected heap |
|gccapacity | Statistics of the capacities of the generations and their |
| | corresponding spaces. |
|gccause | Summary of garbage collection statistics (same as -gcutil), |
| | with the cause of the last and current (if applicable) |
| | garbage collection events. |
|gcnew | Statistics of the behavior of the new generation. |
|gcnewcapacity | Statistics of the sizes of the new generations and its corre- |
| | sponding spaces. |
|gcold | Statistics of the behavior of the old and permanent genera- |
| | tions. |
|gcoldcapacity | Statistics of the sizes of the old generation. |
|gcpermcapacity | Statistics of the sizes of the permanent generation. |
|gcutil | Summary of garbage collection statistics. |
|printcompilation | Summary of garbage collection statistics. |
+-----------------+---------------------------------------------------------------+
2.2.1 jstat -gc PID [5000] [7]
垃圾回收统计(此处是每隔5秒刷新一次,共打印7次)
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
参数解析:尖括号<>内是必填, [ ] 中的是选填
- -t 表明第一列为时间戳,是从系统启动开始的时间开始算(单位秒)
- -h 代表多少行需要重新显示表头, 比如 h3, 是每隔3行显示表头
- [<interval>] 是表示每隔多少秒打印一次,例如:5000或者 5s 表示每隔5秒打印一次
- [<count>] 表示一共打印多少次,例如: 7, 一共打印7次
- S0C:第一个幸存区的大小(单位:KB,以下大小单位一样)
- S1C:第二个幸存区的大小
- S0U:第一个幸存区的使用大小
- S1U:第二个幸存区的使用大小
- EC:伊甸园区的大小
- EU:伊甸园区的使用大小
- OC:老年代大小
- OU:老年代使用大小
- MC:方法区大小
- MU:方法区使用大小
- CCSC:压缩类空间大小
- CCSU:压缩类空间使用大小
- YGC:年轻代垃圾回收次数
- YGCT:年轻代垃圾回收消耗时间
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
2.2.2 jstat -gcutil PID <1s>
总结垃圾回收统计(此处是每隔1秒刷新一次)
S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
2.2.3 jstat -gcnew PID
新生代垃圾回收统计
- S0C:第一个幸存区大小
- S1C:第二个幸存区的大小
- S0U:第一个幸存区的使用大小
- S1U:第二个幸存区的使用大小
- TT:对象在新生代存活的次数
- MTT:对象在新生代存活的最大次数
- DSS:期望的幸存区大小
- EC:伊甸园区的大小
- EU:伊甸园区的使用大小
- YGC:年轻代垃圾回收次数
- YGCT:年轻代垃圾回收消耗时间
2.2.4 jstat -gccapacity PID
堆内存统计
NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0C:第一个幸存区大小
S1C:第二个幸存区的大小
EC:伊甸园区的大小
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:当前老年代大小
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代gc次数
FGC:老年代GC次数
2.2.5 jstat -gcmetacapacity PID
元数据空间统计
NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0CMX:最大幸存1区大小
S0C:当前幸存1区大小
S1CMX:最大幸存2区大小
S1C:当前幸存2区大小
ECMX:最大伊甸园区大小
EC:当前伊甸园区大小
YGC:年轻代垃圾回收次数
FGC:老年代回收次数
2.2.6 jstat -gcoldcapacity PID
老年代内存空间统计
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:老年代大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
三、jinfo(可查看或修改jvm信息)
jinfo -help
可查看jinfo使用帮助
3.1 jinfo -flags PID
查看所有VM设置参数
3.2 jinfo -flag [+|-]name pid
开启/关闭对应名称的参数
使用 jinfo 可以在不重启虚拟机的情况下,可以动态的修改 jvm 的参数。尤其在线上的环境特别有用。
3.3 jinfo -flag name = value
修改指定参数的值
四、jcmd:多工具集合,导出堆/线程信息,查看java进程,执行GC等
- Perfcounter.print:打印目标Java进程上可用的性能计数器。性能计数器的列表可能会随着Java进程的不同而产生变化。
- -f file:从文件file中读取命令,然后在目标Java进程上调用这些命令。在file中,每个命令必须写在单独的一行。以"#"开头的行会被忽略。当所有行的命令被调用完毕后,或者读取到含有stop关键字的命令,将会终止对file的处理。
- -l:查看所有的进程列表信息。
4.1 jcmd PID help
列出当前运行JAVA进程可以执行的操作
查看具体命令的选项:
jcmd 9136 help JFR.dump
查看运行JFR.dump 需要哪些选项
4.2 jcmd PID GC.run
运行GC
堆JVM执行 java.lang.System.gc()
五、jmap
5.1 概述
命令jmap是一个多功能的命令。它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。
参数:
- 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:<dump-options>:生成堆转储快照
- F: 当-dump没有响应时,使用-dump或者-histo参数. 在这个模式下,live子参数无效.
- help:打印帮助信息
- J<flag>:指定传递给运行jmap的JVM的参数
5.2 jmap -heap PID
显示JAVA堆详细信息
5.3 jmap -dump:format=b,file=D:/dump/heap.hprof pid
生成dump文件
以hprof二进制格式转储Java堆到指定filename的文件中。live子选项是可选的。如果指定了live子选项,堆中只有活动的对象会被转储。想要浏览heap dump,你可以使用jhat(Java堆分析工具)读取生成的文件,或者使用eclipse的mat(Memory Analysis)工具
注意:这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用, 线上系统慎用。
六、jstack
概述
jstack是jdk自带的线程堆栈分析工具,使用该命令可以查看或导出 Java 应用程序中线程堆栈信息。
参数说明:
- -l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent 的 ownable synchronizers列表.
- -F 当’jstack [-l] pid’没有相应的时候强制打印栈信息
- -m 打印java和native c/c++框架的所有栈信息.
七、生成GC日志的参数
7.1GC日志配置
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:servers/%SERVER_NAME%_gc.log -XX:+HeapDumpOnOutOfMemoryError
注意,%SERVER_NAME%是win格式,linux下为${SERVER_NAME}。
JVM的GC日志的主要参数包括如下几个:
-XX:+PrintGC 输出简单GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(相对JVM启动时间的秒数)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的输出路径
常用 PrintGCDetails, PrintGCTimeStamps, -Xloggc:../logs/gc.log
八、Native Memory Tracing(NMT)
参考:HotSpot VM的Native Memory Tracking
九、Jprofiler 工具
暂时可用jVisualVM 的 profiler 来代替
参考资料:
jvm 性能调优工具之 jmap
jvm 性能调优工具之 jcmd
jvm 性能调优工具之 jstack
一图理解GC日志
HotSpot VM的Native Memory Tracking