2.6.1 命令行终端
- 标准终端类:jps、jinfo、jstat、jstack、jmap
- 功能整合类:jcmd、vjtools、arthas、greys
2.6.2 可视化界面
- 简易:JConsole、JVisualvm、HA、GCHisto、GCViewer
- 进阶:MAT、JProfiler
命令行推荐 arthas ,可视化界面推荐 JProfiler,此外还有一些在线的平台 gceasy、heaphero、fastthread
1. jmap java自带
命令jmap是一个多功能的命令。它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。
- 更多命令参考 : https://www.jianshu.com/p/a4ad53179df3
1.1 dump:
命令:JVM 中内存信息 jmap -dump:format=b,file=ai-heapdump.phrof {pid}
描述:生成堆转储快照dump文件。
以hprof二进制格式转储Java堆到指定filename的文件中。live子选项是可选的。如果指定了live子选项,堆中只有活动的对象会被转储。想要浏览heap dump,你可以使用jhat(Java堆分析工具)读取生成的文件。这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用, 线上系统慎用。
1.1.1 dump分析
jmap -dump:format=b,file=/tmp/dump.bin 1
- eclipse Memory Analyzer
Eclipse 提供的一个用于分析JVM 堆Dump文件的插件。借助这个插件可查看对象的内存占用状况,引用关系,分析内存泄露等。
http://www.eclipse.org/mat/
- 软件的使用: https://blog.csdn.net/alli0968/article/details/52460008
- https://www.cnblogs.com/kingszelda/p/9034191.html
- 使用jvisualvm来分析dump文件:
jvisualvm是JDK自带的Java性能分析工具,在JDK的bin目录下,文件名就叫jvisualvm.exe。
jvisualvm可以监控本地、远程的java进程,实时查看进程的cpu、堆、线程等参数,对java进程生成dump文件,并对dump文件进行分析。
像我这种从服务器上dump下来文件也可以直接扔给jvisualvm来分析。
使用方式:直接双击打开jvisualvm.exe,点击文件->装入,在文件类型那一栏选择堆,选择要分析的dump文件,打开。
1.2 jmap -histo [pid] JVM堆中对象详细占用情况
1.3 jmap -heap [pid] 查看整个JVM内存状态
要注意的是在使用CMS GC 情况下,jmap -heap的执行有可能会导致JAVA 进程挂起
2. jstack
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。
语法格式如下:
jstack [option] pid
jstack [option] executable core
jstack [option] [server-id@]remote-hostname-or-ip
option
-l long listings,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况
-m mixed mode,不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法)
实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息jps
查询出 java进程ID 8672
第二步找出该进程内最耗费CPU的线程,
可以使用ps -Lfp 8672
或者ps -mp 8672 -o THREAD,tid,time
或者top -Hp 8672
TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID为8672的线程,用
printf "%x\n" 8672
21e0
得到8672的十六进制值为21e0
它用jstack来输出进程8672的堆栈信息,然后根据线程ID的十六进制值grep,如下:jstack 8672| grep 21e0
3. [可视化工具] jconsole
4. jstat -gcutil [pid]
更多文章: 作者:jijs 链接:https://www.jianshu.com/p/213710fb9e40
统计gc信息
- S0 :年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
- S1 :年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
- E :年轻代中Eden(伊甸园)已使用的占当前容量百分比
- O :old代已使用的占当前容量百分比
- P :perm代已使用的占当前容量百分比
- YGC :从应用程序启动到采样时年轻代中gc次数
- YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)
- FGC :从应用程序启动到采样时old代(全gc)gc次数
- FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
- GCT:从应用程序启动到采样时gc用的总时间(s)
5. jps
jps 命令类似与 linux 的 ps 命令,但是它只列出系统中所有的 Java 应用程序。 通过 jps 命令可以方便地查看 Java 进程的启动类、传入参数和 Java 虚拟机参数等信息。
jps [options] [hostid]
jps -v 打印参数
如果不指定hostid就默认为当前主机或服务器。
命令行参数选项说明如下:
-q 不输出类名、Jar名和传入main方法的参数
-m 输出传入main方法的参数
-l 输出main类或Jar的全限名
-v 输出传入JVM的参数
jinfo -flags pid
查看 jvm 启动参数
VisualVM:
故障处理工具