深入JVM系列之(3):JavaCore和HeapDump
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这类工具。这类文件最重要的作用就是分析系统中是否存在内存溢出的情况。
-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
-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的更多相关文章
- JVM系列【6】GC与调优2.md
JVM系列笔记目录 虚拟机的基础概念 class文件结构 class文件加载过程 jvm内存模型 JVM常用指令 GC与调优 了解HotSpot常用命令行参数 JVM的命令行参数参考: https:/ ...
- JVM系列-常用参数
1.堆内存 堆内存用于存储new对象,垃圾回收器负责堆内存的管理.但Java程序实际占用的空间则由堆内存.栈内存(程序运行栈).程序计数器.常量区.代码区.本地内存等. 堆内存分为Young和Old, ...
- JVM系列文章(四):类载入机制
作为一个程序猿,只知道怎么用是远远不够的. 起码,你须要知道为什么能够这么用.即我们所谓底层的东西. 那究竟什么是底层呢?我认为这不能一概而论.以我如今的知识水平而言:对于Web开发人员,TCP/IP ...
- JVM系列五:JVM监测&工具
JVM系列五:JVM监测&工具[整理中] http://www.cnblogs.com/redcreen/archive/2011/05/09/2040977.html 前几篇篇文章介绍了介 ...
- JVM系列文章(三):Class文件内容解析
作为一个程序猿,只知道怎么用是远远不够的.起码,你须要知道为什么能够这么用.即我们所谓底层的东西. 那究竟什么是底层呢?我认为这不能一概而论.以我如今的知识水平而言:对于Web开发人员,TCP/IP. ...
- jvm系列(七):jvm调优-工具篇
16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化.工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗 ...
- jvm系列(八):jvm知识点总览-高级Java工程师面试必备
在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后 ...
- jvm系列 (二) ---垃圾收集器与内存分配策略
垃圾收集器与内存分配策略 前言:本文基于<深入java虚拟机>再加上个人的理解以及其他相关资料,对内容进行整理浓缩总结.本文中的图来自网络,感谢图的作者.如果有不正确的地方,欢迎指出. 目 ...
- jvm系列 (三) ---锁的优化
锁的优化 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 jvm系列(三):锁的优化 我的博客目录 锁的四种状态 从低到高,只能升级不能降级 无锁状态 偏向锁 ...
随机推荐
- SQL2012数据库加密方法
1.非对称密钥来保护新的对称密钥 /*--测试环境 Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) Oct 19 2012 13:38:57 C ...
- PHP模拟发送POST请求之三、用Telnet和fsockopen()模拟发送POST信息
了解完了HTTP头信息和URL信息的具体内容,我们开始尝试自己动手写一段头信息发送到服务器.Windows内置命令Telnet可以帮助我们发送简单的HTTP请求. 并且TELNET是一个特别灵活的工具 ...
- 利用Keydown事件阻止用户输入
先了解下各事件的区别 keydown:在控件有焦点的情况下按下键时发生 keypress:在控件有焦点的情况下按下键时发生 keyup: 在控件有焦点的情况下释放键时发生 意义 keypress主 ...
- 本地数据下,radiobutton和图片组合,利用adapter+listview进行单选
浮生偷得半日闲,等接口定义的过程中,重新复习下adapter+listview实现单选的方法 主界面 <RelativeLayout xmlns:android="http://sch ...
- JS判断浏览器类型及版本
浏览器 ie firefox opera safari chrome 分类: 一路辛酸---JavaScript 你知道世界上有多少种浏览器吗?除了我们熟知的IE, Firefox, Opera, S ...
- 迅为4412开发板支持AVIN视频输入/AV监控摄像头输入模块
AVIN模块(iTOP-4412开发板专用) 产品介绍:视频输入/AV监控摄像头输入模块: 该模块及配套的软件为开发视频采集.监控.车载后视等产品提供了很好的参考. iTOP-4412 开发平台 开发 ...
- pycharm 4.5在debian下安装
1.去官网下载linux下的Tar包,下载后解压. 2.直接进入解压后的folder里面找bin下面的pycharm.sh,执行后发现没有任何反应. 3.查询资料发现是因为pycharm需要sun j ...
- TC79
/* INSERT INTO TC79(PatientID,AdmissionDate,DischargeDate,Cost) SELECT * FROM ( SELECT 709,TO_DATE(' ...
- perl学习笔记
一.正则表达式 匹配一个文件中的某个单词,并打印出来 #!/usr/bin/perl use strict; use warnings; ; open(FILE, "< temp.pl ...
- Java向上转型与向下转型
一.向上转型 例如:Parent p=new Son(); 这样引用p只能调用子类中重载父类的方法:但属性是父类的:如果想调用子类属性的话,可以用getter()方法. 二.向下转型 子类对象的父类引 ...