分析工具
JVM性能相关的6个常用的JDK命令
- jps:查询JVM中的所有进程,找出将要操作的PID,是所有命令的基础
- jstat:查看相应JVM进程的gc、类加载卸载信息,是没有GUI界面查看JVM运行数据的首选
- jinfo:查看和在运行期动态修改JVM配置参数
- jmap:生成堆转储快照和比较占内存的对象
- jhat:配合jmap分析堆转储日志
- jstack:生成线程快照,定位线程长时间卡顿的原因(线程间死锁、死循环、请求外部资源导致的长时间等待)
jdk8的相关工具的索引:https://docs.oracle.com/javase/8/docs/technotes/tools/
1、jps:查看本地正在运行的java进程和进程ID(pid)
2、jstat(在运行期定位JVM性能问题的首选):用于监视JVM各种堆和非堆内存大小和使用量
1)jstat -gc pid:输出gc信息,包括gc次数和时间,内存使用状况
详细说明:https://www.cnblogs.com/zhi-leaf/p/10629776.html
3、jinfo:查看指定pid的所有jvm信息
1)jinfo -flags pid 查询虚拟机运行参数信息。
2)jinfo -flag name pid,查询具体参数信息,如jinfo -flag UseSerialGC 42324,查看是否启用UseSerialGC
4、jmap
1)jmap -heap pid:输出堆内存设置和使用情况
2)jmap -histo pid:输出heap的直方图,包括类名,对象数量,对象占用大小
3)jmap -histo:live pid:同上,只输出存活对象信息
4)jmap -dump:format=b,file=文件名 PID生成堆转储快照和查看最占内存的元素,用于分析内存泄露问题。
5、jhat:分析堆转储快照(与jmap配合)
执行上述命令后,打开localhost:7000
6、jstack:生成线程快照,定位线程长时间卡顿的原因(线程间死锁、死循环、请求外部资源导致的长时间等待)
1)jstack -l pid:查看进程中的所有线程的堆栈信息
具体应用可参考:快速定位生产故障问题-JVM进程CPU占用率高于100%
JavaCore/HeapDump文件及其分析方法
一般生产不会让你直接操作服务器查看,所以可以找运维要javacore和Heapdump文件
- JavaCore文件主要保存的是Java应用各线程在某一时刻的运行的位置,即JVM执行到哪一个类、哪一个方法、哪一个行上。它是一个文本文件,打开后可以看到每一个线程的执行栈,以stack trace的显示。通过对JavaCore文件的分析可以得到应用是否“卡”在某一点上,即在某一点运行的时间太长,例如数据库查询,长期得不到响应,最终导致系统崩溃等情况。
- HeapDump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况,这种文件需要相应的工具进行分析,如IBM Heap Analyzer这类工具。这类文件最重要的作用就是分析系统中是否存在内存溢出的情况。
如何生成
Heap Dump文件生成
- JVM的配置参数:可以添加
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=${目录}(heapdump文件存放位置)参数,当应用抛出 OutOfMemoryError 时自动生成dump文件 - jconsole生成:jconsole是sun的JDK中自带的工具,在java_home/bin/jconsole.exe中就可以打开。p0参数填上提取出heap dump后的存储路径,p1参数填上true以导出仍未被回收的Objects信息
- jmap命令生成:jmap -dump:live,format=b,file=heap.bin pid
- jvisualvm生成:jvisualvm是sun的JDK中自带的工具,在java_home/bin/jvisualvm.exe中就可以打开
JavaCore生成
- 系统宕机自动生成。IBM的JDK在系统宕机的时候会自动生成javacore,这也是我们经常用该JDK替换默认的缘故
- kill -3 -pid 在linux平台上,可以直接调用系统的kill -3方法
- jvisualvm生成
如何分析
问题思路
1、线程是否阻塞、死锁了。
2、内存泄漏导致垃圾回收频繁、垃圾回收耗时高
性能问题的原因就很多了,例如:
- 数据库连接一直未释放,慢sql(大数据的查询)
- 基于poi生成excel文件,占用内存
- 参数配置不合理,如Jboss的最大线程数设置默认值10,如不调整在大并发下,性能无法达到预期