#浅谈 Java Dump 分析
对于使用Java开发的项目,我们如果遇到 Java JVM CPU 资源占用很高的问题,对于这类问题应该以什么样的思路去排查和解决呢,下面讲下Java Dump ,会对解决此类问题有帮助;
一.什么是 Java Dump?
-
Java 虚拟机的运行时快照,将Java虚拟机运行时的状态和 信息保存到文件;
-
Java Dump 文件包括如下:
-
线程 Dump,包含所有线程的运行状态。纯文本格式;
-
堆Dump,包含线程 Dump,幵包含所有堆对象的状态,二进制格式;
二.Java Dump 有什么用?
-
1.Java进程的快照,保存状态和信息可用亍Bug的分析等。
-
2.补足传统Bug分析手段的不足:
- 可在任何Java环境使用;信息量充足;
- 针对非功能正确性的Bug,主要为:多线程幵发、内存泄漏;
三.制作 Java Dump
1.制作Java Dump 原理
- 使用JDK提供的工具,连接目标虚拟机,制作Dump。
- 目标和工具都使用1.6或以上的Java;发行版相同。
2.常见的Java虚拟机如下:
不同Java虚拟机的Dump规范不完全相同,例如:
- HotSpot VM :Sun官方的Java虚拟机实现
- OpenJDK : 开源版本的虚拟机实现
- JRockit : BEA开发的,Weblogic使用的虚拟机
- IBM J9 VM : AIX平台的Java虚拟机
Dump 格式
- 线程Dump :纯文本,各虚拟机发行版略微不同
- 堆Dump : 二进制格式
- HotSpot VM不OpenJDK:HPROF格式
- JRockit:没有堆Dump,使用飞行记录
- IBM J9 VM:IBM Portable Heap Dump(PHD)格式
制作 Dump 的工具
- 1 . Java虚拟机参数 |
- 2 . 图形化工具 |
- 3 . 命令行工具 |
这里只讲,命令行的工具制作Dump 方法;
1.首先简单了解下 在JDK的bin目录下,包含的Java 命令及其他的实用工具:
- jps:查看本机的Java进程信息
- jstack:打印线程的栈信息,制作线程Dump
- jmap:打印内存映射,制作堆Dump
- jconsole:简易的可视化控制台
- jvsualvm:功能强大的控制台
- jstat:性能监控工具
- jhat:内存分析工具
制作dump 一般步骤如下:
1.检查虚拟机版本:java -version
2.执行命令:top 或者 ps -ef |grep java 找出目标Java应用的进程ID
3.使用jstack命令制作线程Dump
4.Linux环境下使用kill命令制作线程Dump
5.使用jmap命令制作堆Dump
首先我们通过top命令可以看到如下图:
-
使用jstack制作线程Dump:
jstack <进程ID> >> <输出文件> -
Linux下使用Kill命令制作线程Dump
输出线程Dump到目标Java进程的标准输出。
kill -quit <进程ID>
kill -3 <进程ID>
比如:执行 kill -3 3282 ,thread 信息输出问题会放到应用服务器的默认输出文件中,Tomcat默认输出到catalina.out 文件中
- 使用jmap命令制作堆Dump
jmap -dump:format=b,file=<输出文件> <进程ID>
通过以上的方式,我们可以获取到占用CPU较高Java 进程中 线程Dump和堆Dump的信息,通过这些信息我们去分析造成CPU 占用很长时间的代码问题;大家如果有问题或者其他方面的Java性能问题,也欢迎提问,我看到后会回复;