jvm 生成javacore和heapdump文件

在Server端开发与运维中,经常需要生成javacore和heapdump文件,以便分析jvm的运行状态。javacore文件中给出jvm线程的详细情况,而heapdump文件则给出jvm的运行时内存的使用情况,对分析JVM的内存泄漏有重要的作用。其中,javacore文件一般是文本文件,而heapdump则一般是二进制文件,需要使用专门的分析工具进行分析,一般常用的工具为IBM的heap anylizer。

JavaCore是关于CPU的,而HeapDump文件是关于内存的。

JavaCore文件主要保存的是Java应用各线程在某一时刻的运行的位置,即JVM执行到哪一个类、哪一个方法、哪一个行上。它是一个文本文件,打开后可以看到每一个线程的执行栈,以stack trace的显示。通过对JavaCore文件的分析可以得到应用是否“卡”在某一点上,即在某一点运行的时间太长,例如数据库查询,长期得不到响应,最终导致系统崩溃等情况。

一般JavaCore文件生成两个比较有效,可以对比这两个JavaCore文件,来对比哪个线程“卡”住了。

HeapDump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况,这种文件需要相应的工具进行分析,如IBM Heap Analyzer这类工具。这类文件最重要的作用就是分析系统中是否存在内存溢出的情况。

(1)Oracle JVM
如果使用Oracle JVM也就是标准的SUN JVM(SUN已被oracle收购)当内存溢出时生成heapdump文件配置如下

 -Xloggc:${目录}/temp_gc.log           (GC日志文件)
-XX:+HeapDumpOnOutOfMemoryError (内存溢出时生成heapdump文件)
-XX:HeapDumpPath=${目录} (heapdump文件存放位置)

如果要即时动态生成heapdump文件可以使用jmap命令,jdk6.0已取消了-XX:+HeapDumpOnCtrlBreak配置参数通过ctrl+break的方式。

 jmap -dump:format=b,file=temp_heapdump.hprof 

而javacore文件的生成,则需要依赖于kill命令,当jvm进程被杀死的时候,生成javacore文件。

(2)HP JVM

与生成heapdump相关的命令行参数:

 -Xverbosegc:file=${目录}/temp_gc.log  (GC日志文件)
-XX:+HeapDumpOnOutOfMemoryError (内存溢出时生成heapdump文件)
-XX:+HeapDumpOnCtrlBreak (可以通过ctrl+break组合键动态生成heapdump文件 HP JVM也在jdk6中取消了这一方式吗??)
-XX:HeapDumpPath=${目录} (heapdump文件存放位置)

(3)IBM JVM
非windows操作系统环境中

 -XverboseGClog: ${目录}/temp_gc.log   (GC日志文件)
-Xdump:heap:events=user,file=${目录}/pid%uid%pid.phd

表示可以根据需要通过kill -3 产生DUMP文件,%uid和%pid为变量

windows操作系统环境中:启动wsadmin,进入wsadmin环境

 wsadmin> set jvm [$AdminControl completeObjectName type=JVM,process=server1,*]
wsadmin> $AdminControl invoke $jvm generateHeapDump
wsadmin> $AdminControl invoke $jvm dumpThreads

以上主要是通过命令行,配置使用kill命令生成javacore和heapdump文件。

on-the-fly way

linux环境下,使用ps -ef 或者ps -aux命令,或者top命令,得到pid,然后使用kill 命令杀死特定进程,产生java core 和heap dump 文件。kill命令就是用户向进程发送signal。

那么问题来了: kill命令必须杀死进程才能获得java core和heap dump文件,能否在不杀死进程的情况下产生这两个文件呢?

实际上,jdk给我们提供了多种工具命令,这些命令保存在jdk的bin目录下,它们被称为Standard JDK Tools and Utilities基本的工具有:appletviewer, apt, extcheck, jar, java, javac, javadoc, 等等。 而用来Troubleshooting的工具主要有:jinfo, jhat, jmap, jsadebugd, jstack,jstat等等。

jmap:

jmap prints shared object memory maps or heap memory details of a given process or core file or a remote debug server. If the given process is running on a 64-bit VM, you may need to specify the -J-d64 option, e.g.:

jmap -J-d64 -heap pid

jmap输出如下:
 C:\Users\IBM_ADMIN>jmap -J-d64 -heap 9952
Attaching to process ID 9952, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.60-b23

using thread-local object allocation.
Parallel GC with 4 thread(s) Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 1073741824 (1024.0MB)
NewSize = 89128960 (85.0MB)
MaxNewSize = 357564416 (341.0MB)
OldSize = 179306496 (171.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB) Heap Usage:
PS Young Generation
Eden Space:
capacity = 348651520 (332.5MB)
used = 4341152 (4.140045166015625MB)
free = 344310368 (328.3599548339844MB)
1.245126365718985% used
From Space:
capacity = 1048576 (1.0MB)
used = 0 (0.0MB)
free = 1048576 (1.0MB)
0.0% used
To Space:
capacity = 1048576 (1.0MB)
used = 0 (0.0MB)
free = 1048576 (1.0MB)
0.0% used
PS Old Generation
capacity = 525860864 (501.5MB)
used = 280628384 (267.6280822753906MB)
free = 245232480 (233.87191772460938MB)
53.36551989539195% used 36434 interned Strings occupying 3405440 bytes.

 

jhat:

parses a java heap dump file and launches a webserver. jhat enables you to browse heap dumps using your favorite webbrowser.

jstat:

输出的各列的含义。可见该命令也主要针对运行时内存。

Column Description
S0 Survivor space 0 utilization as a percentage of the space's current capacity.
S1 Survivor space 1 utilization as a percentage of the space's current capacity.
E Eden space utilization as a percentage of the space's current capacity.
O Old space utilization as a percentage of the space's current capacity.
P Permanent space utilization as a percentage of the space's current capacity.
YGC Number of young generation GC events.
YGCT Young generation garbage collection time.
FGC Number of full GC events.
FGCT Full garbage collection time.
GCT Total garbage collection time.

 jstack:

jstack prints Java stack traces of Java threads for a given Java process or core file or a remote debug server.

jstack -J-d64 -m pid
-m
prints mixed mode (both Java and native C/C++ frames) stack trace.

样例输出如下:

 C:\Users\IBM_ADMIN>jstack -J-d64 -m 9952
Attaching to process ID 9952, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.60-b23
Deadlock Detection: No deadlocks found. ----------------- 0 -----------------
0x00000000776e937a USER32!WaitMessage + 0xa
----------------- 1 -----------------
----------------- 2 -----------------
----------------- 3 -----------------
----------------- 4 -----------------
----------------- 5 -----------------
----------------- 6 -----------------
----------------- 7 -----------------
----------------- 8 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 9 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 10 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 11 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 12 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 13 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 14 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 15 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 16 -----------------
----------------- 17 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 18 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 19 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 20 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 21 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 22 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 23 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 24 -----------------
0x000000007793c0ea ntdll!NtWaitForMultipleObjects + 0xa
----------------- 25 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 26 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 27 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 28 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 29 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 30 -----------------
0x000000007793c0ea ntdll!NtWaitForMultipleObjects + 0xa
----------------- 31 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 32 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 33 -----------------
----------------- 34 -----------------
----------------- 35 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 36 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 37 -----------------
----------------- 38 -----------------
0x000000007793c0ea ntdll!NtWaitForMultipleObjects + 0xa
----------------- 39 -----------------
0x000000007793c0ea ntdll!NtWaitForMultipleObjects + 0xa
----------------- 40 -----------------
0x000000007793c0ea ntdll!NtWaitForMultipleObjects + 0xa
----------------- 41 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 42 -----------------
----------------- 43 -----------------
0x000000007793c0ea ntdll!NtWaitForMultipleObjects + 0xa
----------------- 44 -----------------
----------------- 45 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 46 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 47 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 48 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 49 -----------------
----------------- 50 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 51 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa
----------------- 52 -----------------
0x000000007793bb7a ntdll!ZwWaitForSingleObject + 0xa

基本看不懂。。。

结论: 要想debug一个真正的bug,还得靠详细的javacore文件和heapdump文件!

参考文献:

http://www.codeceo.com/article/java-javacore-heapdump.html

http://blog.itpub.net/14710393/viewspace-754416

工具集:

http://docs.oracle.com/javase/7/docs/technotes/tools/index.html#jconsole

http://docs.oracle.com/javase/7/docs/technotes/tools/share/jmap.html

http://docs.oracle.com/javase/7/docs/technotes/tools/share/jhat.html

http://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html

http://docs.oracle.com/javase/7/docs/technotes/tools/share/jstack.html

深入JVM系列之(3):JavaCore和HeapDump的更多相关文章

  1. JVM系列【6】GC与调优2.md

    JVM系列笔记目录 虚拟机的基础概念 class文件结构 class文件加载过程 jvm内存模型 JVM常用指令 GC与调优 了解HotSpot常用命令行参数 JVM的命令行参数参考: https:/ ...

  2. JVM系列-常用参数

    1.堆内存 堆内存用于存储new对象,垃圾回收器负责堆内存的管理.但Java程序实际占用的空间则由堆内存.栈内存(程序运行栈).程序计数器.常量区.代码区.本地内存等. 堆内存分为Young和Old, ...

  3. JVM系列文章(四):类载入机制

    作为一个程序猿,只知道怎么用是远远不够的. 起码,你须要知道为什么能够这么用.即我们所谓底层的东西. 那究竟什么是底层呢?我认为这不能一概而论.以我如今的知识水平而言:对于Web开发人员,TCP/IP ...

  4. JVM系列五:JVM监测&工具

    JVM系列五:JVM监测&工具[整理中]  http://www.cnblogs.com/redcreen/archive/2011/05/09/2040977.html 前几篇篇文章介绍了介 ...

  5. JVM系列文章(三):Class文件内容解析

    作为一个程序猿,只知道怎么用是远远不够的.起码,你须要知道为什么能够这么用.即我们所谓底层的东西. 那究竟什么是底层呢?我认为这不能一概而论.以我如今的知识水平而言:对于Web开发人员,TCP/IP. ...

  6. jvm系列(七):jvm调优-工具篇

    16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化.工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗 ...

  7. jvm系列(八):jvm知识点总览-高级Java工程师面试必备

    在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后 ...

  8. jvm系列 (二) ---垃圾收集器与内存分配策略

    垃圾收集器与内存分配策略 前言:本文基于<深入java虚拟机>再加上个人的理解以及其他相关资料,对内容进行整理浓缩总结.本文中的图来自网络,感谢图的作者.如果有不正确的地方,欢迎指出. 目 ...

  9. jvm系列 (三) ---锁的优化

    锁的优化 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 jvm系列(三):锁的优化 我的博客目录 锁的四种状态 从低到高,只能升级不能降级 无锁状态 偏向锁 ...

随机推荐

  1. 应用Spring MVC发布restful服务是怎样的一种体验

            摘要:“约定优于配置”这是一个相当棒的经验,SOAP服务性能差.基于配置.紧耦合,restful服务性能好.基于约定.松耦合,现在我就把使用Spring MVC发布restful服务的 ...

  2. cocos2d-x之猜数字游戏

    bool HelloWorld::init() { if ( !Layer::init() ) { return false; } visibleSize = Director::getInstanc ...

  3. 闭包Closures

    所谓闭包,可以理解为一个可以用于函数,参数,返回值处的代码块 import Foundation func isGood(a:Int,b:Int)->Bool{ return a>b; } ...

  4. android SQLiteOpenHelper使用示例

    我们大家都知道Android平台提供给我们一个数据库辅助类来创建或打开数据库,这个辅助类继承自SQLiteOpenHelper类,在该类的 构造器中,调用Context中的方法创建并打开一个指定名称的 ...

  5. Busybox下mdev配置说明

    [TOC] mdev说明 mdev是busybox自带的一个简化版的udev,适合嵌入式应用场合.其具有使用简单的特点.它的作用就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需要的节点 ...

  6. spring hadoop 访问hbase入门

    1.  环境准备: Maven Eclipse Java Spring 版本 3..2.9 2. Maven  pom.xml配置 <!-- Spring hadoop --> <d ...

  7. Hadoop_HDFS文件读写代码流程解析和副本存放机制

    Hadoop学习笔记总结 01.RPC(远程过程调用) 1. RPC概念 远程过程指的不是同一个进程的调用.它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. 不能直接拿到远 ...

  8. sqlite查询结果在listview中展示

    1.获取db实例 SQLiteDatabase db=dbhelper.getWritableDatabase(); 2.Cursord对象获取查询结构 Cursor cursor=db.rawQue ...

  9. html5 实现video标签的自定义播放进度条

    现在随着html5的渐热,越来越多的web开发者都开始选择使用html5写出一些比较好的web应用. html代码: <!DOCTYPE html> <html lang=" ...

  10. leetcode-Spiral Matrix II 螺旋矩阵2之python大法好,四行就搞定,你敢信?

    Spiral Matrix II 螺旋矩阵 Given an integer n, generate a square matrix filled with elements from 1 to n2 ...