浅谈 Java Dump 分析

jvm性能优化
javadump

#1

浅谈 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性能问题,也欢迎提问,我看到后会回复;