您的位置:首页 > 移动开发

BESAppServer中JavaDump分析

2016-05-05 14:32 465 查看
 

1.1. Java dump概述

JavaDump即Java虚拟机的运行时快照。制作和分析dump时,常常将当时Java虚拟机运行时的状态和信息保存到dump文件。

dump分类:

线程Dump,包含JVM进程中所有线程的运行状态。纯文本格式。

堆Dump,包含线程Dump以及所有堆对象的状态。二进制格式。

 

1.2. 制作和分析Dump

1.2.1. 常见Java虚拟机

不同Java虚拟机的Dump规范不完全相同。线程dunp为纯文本格式,各虚拟机略有不同。

Java虚拟机类型

说明

HotSpot VM

原Sun的Java虚拟机实现。堆dump为HPROF二进制格式。

IBM J9 VM

IBM的Java虚拟机,常见于IBM的AIX等机器。堆dump为PHD二进制格式。

OpenJDK

开源版本的Java虚拟机实现,与HotSpot VM实现大部分相同。堆dump为HPROF二进制格式。

JRockit

原BEA的Java虚拟机实现。堆dump为HPROF二进制格式。

HP JDK

HP服务器上的Java虚拟机实现。堆dump为HPROF二进制格式。

 

       IBMPortable Heap Dump (PHD): 这个专有的 IBM 格式只包含进程中每个 Java 对象的类型和大小,以及这些对象之间的关系。这个转储文件格式远远小于其他格式,并且只包含最少的信息。但是,这些数据通常对于分析内存泄漏和了解应用程序基本架构和范围而言是足够的。

       HPROF二进制转储文件: HPROF二进制转储文件在 IBMPHD 格式中包含了所有数据表现方式,以及 Java 对象和线程内部的基本数据类型,您可以查看对象中域的值,查看在转储文件产生时有哪些方法在被执行。其他基本数据使 HPROF 转储文件明显比 PHD 格式的转储文件要大;它们大约与所使用的 Java 堆一样大。

 

1.2.2. 制作Java Dump

在不同的操作系统平台、不同的Java虚拟机环境下,使用图形化或命令行工具,生成指定Java进程的Dump并保存到文件。

使用JDK自带工具,连接BES实例,制作dump

HotSpot 运行时环境:

基于 HotSpot 的 Java 运行时只能够生成 HPROF 格式的转储文件。

可以先通过ps/jps:查看本机的Java中进程信息。然后使用jstack打印线程的栈信息,制作线程Dump。

知识点:

Solaris 下/usr/bin/ps会截短进程名称,很多时候没法知道完整的进程名称,很不方便。而/usr/ucb/ps有参数可以显示全名:

/usr/ucb/ps -auxww |grep java

 

制作heap dump有以下几种方法:

方法

使用说明

Jmap工具

jmap位于 JDK 的 bin 目录,它提供了一种从运行中的进程请求一个 HPROF 转储文件的选项。在 Java 5 中,要使用:

jmap -dump:format=b pid

而在 Java 6 中,要使用以下命令,其中 live 是可选的,表示只返回正在写到转储文件进程 ID (PID) 的 “live” 对象:

jmap -dump[live,]format=b,file=filename pid

Jconsole工具

dumpHeap 操作是基于 JConsole 的 HotSpotDiagnostic MBean 提供的。这个操作要求必须生成一个 HPROF Dump。

JVM事件

遇到 OutOfMemoryError 时: 如果运行中应用程序设置了 -XX:+HeapDumpOnOutOfMemoryError 命令行选项,那么当出现OutOfMemoryError 错误时就会有一个 HPROF 格式的转储文件生成。在生产系统中使用这种方法非常好,因为它几乎一直需要分析内存问题,并且它不会引起额外的性能开销。在旧版本的基于 HotSpot 的 Java 运行时中,每次 JVM 执行时这个事件所产生的堆转储文件数量并没有限制;而在新的版本中,每次 JVM 执行的事件所生成的堆转储文件具有一个最大值。

jmap使用示例:

 




制作thread dump:

  jstack主要用来查看某个Java进程内的线程堆栈信息。语法格式如下:

Usage:
    jstack [-l] <pid>
        (to connect to running process)
    jstack -F [-m] [-l] <pid>
        (to connect to a hung process)
    jstack [-m] [-l] <executable> <core>
        (to connect to a core file)
    jstack [-m] [-l] [server_id@]<remote server IP or hostname>
        (to connect to a remote debug server)

Options:
    -F  to force a thread dump. Use when jstack <pid> does not respond (process is hung)
    -m  to print both java and native frames (mixed mode)
    -l  long listing. Prints additional information about locks
    -h or -help to print this help message
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  threaddump heapdump