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. SQL2012数据库加密方法

    1.非对称密钥来保护新的对称密钥 /*--测试环境 Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) Oct 19 2012 13:38:57 C ...

  2. PHP模拟发送POST请求之三、用Telnet和fsockopen()模拟发送POST信息

    了解完了HTTP头信息和URL信息的具体内容,我们开始尝试自己动手写一段头信息发送到服务器.Windows内置命令Telnet可以帮助我们发送简单的HTTP请求. 并且TELNET是一个特别灵活的工具 ...

  3. 利用Keydown事件阻止用户输入

    先了解下各事件的区别 keydown:在控件有焦点的情况下按下键时发生 keypress:在控件有焦点的情况下按下键时发生 keyup:   在控件有焦点的情况下释放键时发生 意义 keypress主 ...

  4. 本地数据下,radiobutton和图片组合,利用adapter+listview进行单选

    浮生偷得半日闲,等接口定义的过程中,重新复习下adapter+listview实现单选的方法 主界面 <RelativeLayout xmlns:android="http://sch ...

  5. JS判断浏览器类型及版本

    浏览器 ie firefox opera safari chrome 分类: 一路辛酸---JavaScript 你知道世界上有多少种浏览器吗?除了我们熟知的IE, Firefox, Opera, S ...

  6. 迅为4412开发板支持AVIN视频输入/AV监控摄像头输入模块

    AVIN模块(iTOP-4412开发板专用) 产品介绍:视频输入/AV监控摄像头输入模块: 该模块及配套的软件为开发视频采集.监控.车载后视等产品提供了很好的参考. iTOP-4412 开发平台 开发 ...

  7. pycharm 4.5在debian下安装

    1.去官网下载linux下的Tar包,下载后解压. 2.直接进入解压后的folder里面找bin下面的pycharm.sh,执行后发现没有任何反应. 3.查询资料发现是因为pycharm需要sun j ...

  8. TC79

    /* INSERT INTO TC79(PatientID,AdmissionDate,DischargeDate,Cost) SELECT * FROM ( SELECT 709,TO_DATE(' ...

  9. perl学习笔记

    一.正则表达式 匹配一个文件中的某个单词,并打印出来 #!/usr/bin/perl use strict; use warnings; ; open(FILE, "< temp.pl ...

  10. Java向上转型与向下转型

    一.向上转型 例如:Parent p=new Son(); 这样引用p只能调用子类中重载父类的方法:但属性是父类的:如果想调用子类属性的话,可以用getter()方法. 二.向下转型 子类对象的父类引 ...