java core_深入JVM系列之(3):JavaCore和HeapDump

本文详细介绍了在不同JVM(Oracle, HP, IBM)中如何生成javacore和heapdump文件,用于分析JVM的运行状态和内存使用。javacore记录线程信息,heapdump则展示内存分布。常用工具有jmap、jhat、jstat和jstack,它们可以帮助诊断内存泄漏和性能问题。生成heapdump还可以通过设置JVM参数或使用特定命令如jmap。" 79532895,2124415,日志读取分析算法实战,"['日志读取', 'Algorithm', '分析算法', '日志分析', '系统优化']
摘要由CSDN通过智能技术生成

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文件配置如下

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

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

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

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

(2)HP JVM

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

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

(3)IBM JVM

非windows操作系统环境中

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

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

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

1 wsadmin> set jvm [$AdminControl completeObjectName type=JVM,process=server1,*]2 wsadmin> $AdminControl invoke $jvmgenerateHeapDump3 wsadmin> $AdminControl invoke $jvmdumpThreads

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

on-the-fly way

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

那么问题来了: kill命令必须杀死进程才能获得java co

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值