关于javacore和dump文件

10 篇文章 55 订阅 ¥29.90 ¥99.00
本文详细介绍了Java内存分析中的Heap Dump、Thread Dump和Core Dump的生成与分析方法,包括使用jmap、jstack、jcmd、jvisualvm、MAT等工具,以及在Aix系统上的特殊处理。通过对这些转储文件的分析,可以帮助开发者进行调优和故障排查。
摘要由CSDN通过智能技术生成

Dump 就是对程序运行时内存上的信息进行转储, 让我们可以查看程序当时的运行情况. Dump 对于调优和排错是非常有用的工具.

Heap Dump

Java 运行时对象分配在堆内存上, Heap dump 就是对堆内存进行转储.

生成

jmap

通过命令jmap -dump:live,format=b,file=***.hprof pid

eg:jmap -dump:live,format=b,file=dump.hprof 48671

环境变量

-XX: HeapDumpOnOutOfMemoryError
当OutOfMemoryError发生时自动生成 Heap Dump 文件

-XX:HeapDumpPath=d:\test.hprof
指定 dump 文件存储路径

eclipse参数

eclipse中运行参数添加运行参数

-XX: HeapDumpOnOutOfMemoryError ##dump出当前的内存堆转储快照
-XX:HeapDumpPath=E:\job   ##指定路径(转储文件还是挺大的)

jconsole

image-20200103010601431

ps:好像生成dump文件,然后把后缀改成hprof也可以(忘了从哪里看到的了,用它须谨慎)

jvisualvm

image-20200104122020054

img

-Xrunhprof:head=site

在JVM的配置参数中添加 -Xrunhprof:head=site 参数,会生成java.hprof.txt 文件,不过这样会影响JVM的运行效率,不建议在生产环境中使用(未亲测)。

分析

可以使用 Java 自带的 jhat 工具来分析 Heap dump:

jhat
等待一会, 就会提示

Started HTTP server on port 7000
Server is ready.
这时候浏览器中访问 127.0.0.1:7000 就可以了.

但是, jhat 在分析较大的 Heap dump 时效率比较差, 所以推荐使用 eclipse 提供的 Memory Analyzer (MAT) 来分析.

Thread Dump

Thread dump 转储的是线程相关的内存数据 (例如该线程的调用栈). Thread dump 有时候也被称为 javacore, 不过好像 javacore 是 IBM 虚拟机才有的.

生成

VisualVM Profiler

右键选择线程Dump便会自动生成线程转储文件,当然你也可以连接远程机器对其进行监控和分析

img

jstack

jdk自带的工具jstack通过它我们也可以生成应用程序的线程转储文件,只需要两步即可完成:

1>找到应用程序的进程ID  
ps -eaf | grep java
2> 输出线程转储信息到文件或控制台
jstack PID >> mydumps.tdump
jstack PID  

kill -3 PID

该方法与其它生成线程转储文件的方法略有不同,当kill命令发出时,线程存储文件将在该应用程序的外部生成,如果java程序是一个Tomcat服务器,带有系统输出文件catalina.out,那么将在此文件中生成线程转储

ps:这个东西准确的说不只能生成thread dump,还能生成下面的core dump,如果是系统的应用生成的就是core dump比如:sleep 100 & ,而且能够通过第三节中的设置修改core文件的路径从而进行转储,但是如果java进程的话,会生成thread dump,这样的话就不能够将相应的内容转储到自己制定的文件中了(至少我没没有尝试成功,而且网上也没有找到相关的资料),只会产生在终端(前台启动的程序)、nohup.out(后台启动的应用)、catalina.out(tomcat应用)、weblogic等应用同理。
注意上面的javacore是ibmjdk中特有的是thread dump的意思,core dump是操作系统级别的,kill -3 在aix的ibmjdk中通过设置java运行时参数-Xdump:java heap system snap:events=user能生成javacore,且通过export IBM_JAVACOREDIR=/dumpfile export IBM_COREDIR=/dumpfile设置相应的文件的位置

综上,sun/oracle的jdk目前看无法对kill -3 生成的thread dump进行转储,但是ibm的jdk可以对kill -3 生成的thread dump进行转储但是这里叫做javacore,这个名字也是ibm jdk特有的

jcmd

jdk8中介绍了jcmd工具,在jdk8及以上环境下,可以使用此命令生成线程转储文件
命令是:

jcmd PID Thread.print

分析

Thread dump 就是个文本文件格式, 直接打开查看就可以了.看到thrad dump的后缀有txt、dump、tdump、log等,看来这个后缀确实没啥用

idea

Intellij IDEA 提供 Stacktrace 的分析, 我们可以用它来分析 Thread dump, 这样可以方便的知道某个线程运行到哪里.

打开 Intellij IDEAD -> Analyze -> Anaylyze Stacktrace…, 把 Thread dump 的内容复制粘贴进去, 确认即可.

jvisualvm

使用方式:直接双击打开jvisualvm.exe,点击文件->装入,在文件类型那一栏选择堆,选择要分析的dump文件,打开。

MAT(推荐)

这个就很棒,能够追踪到源码级别的
这个稍后会写到博文中,因为图片比较多,稍后粘贴出链接

Jhat

一个通过起那段页面解析的,比较简陋,不是很推荐

Core Dump

上面提到的 Heap dump 和 Thread dump 都是和 Java 直接相关的, Core dump 则是操作系统提供的, 所有程序在意外退出时, 操作系统都可以生成 Core dump.

Core dump 包含了程序运行时的所有内存信息, 所以我们可以使用 Core dump 同时分析堆内存和运行时栈.

生成

gcore

默认操作系统是不生成 Core dump 的, 我们需要先打开:

如果你用的是 bash

ulimit -c unlimited

如果你像我一样用的是 zsh

limit coredumpsize unlimited
ulimit/limit 是设置 dump 的大小的, 默认为 0 也就是不 dump. 我们可以使用下面的命令来查看当前设置的大小:

如果你用的是 bash

ulimit -c

如果你像我一样用的是 zsh

limit coredumpsize
确认打开后, 我们可以使用 kill -ABRT 来生成 Core dump. 不过需要注意的是, 使用这种方法只有在当前 Terminal 下运行的 Java 程序才能生成 Core dump. 也就是说, 你必须在打开了 Core dump 的 Terminal 下运行 Java 程序, 这样 kill -ABRT 才会生成 Core dump. 如果你 Java 程序运行在一个没有打开 Core dump 的 Terminal 下, 那么即使你的 kill -ABRT 运行在打开了 Core dump 的 Terminal 下, 这时候 Core dump 也是不会生成的.

我们也可以使用 gcore 来生成生成 Core dump. 使用这个方法就无所谓你有没有使用 ulimit/limit 打开 Core dump 了.

sudo gcore

Mac 下 Core dump 生成在 /cores/ 文件夹下.

kill -3 PID

该方法与其它生成线程转储文件的方法略有不同,当kill命令发出时,线程存储文件将在该应用程序的外部生成,如果java程序是一个Tomcat服务器,带有系统输出文件catalina.out,那么将在此文件中生成线程转储

ps:这个东西准确的说不只能生成thread dump,还能生成下面的core dump,如果是系统的应用生成的就是core dump比如:sleep 100 & ,而且能够通过第三节中的设置修改core文件的路径从而进行转储,但是如果java进程的话,会生成thread dump,这样的话就不能够将相应的内容转储到自己制定的文件中了(至少我没没有尝试成功,而且网上也没有找到相关的资料),只会产生在终端(前台启动的程序)、nohup.out(后台启动的应用)、catalina.out(tomcat应用)、weblogic等应用同理。
注意上面的javacore是ibmjdk中特有的是thread dump的意思,core dump是操作系统级别的,kill -3 在aix的ibmjdk中通过设置java运行时参数-Xdump:java heap system snap:events=user能生成javacore,且通过export IBM_JAVACOREDIR=/dumpfile export IBM_COREDIR=/dumpfile设置相应的文件的位置

综上,sun/oracle的jdk目前看无法对kill -3 生成的thread dump进行转储,但是ibm的jdk可以对kill -3 生成的thread dump进行转储但是这里叫做javacore,这个名字也是ibm jdk特有的

须知:

每次用之前运行下下面两句

ulimit -c unlimited
sysctl -w kernel.core_pattern=/var/crash/core.%u.%e.%p

分析

我们可以使用 gdb 来分析 Core dump 文件.

Java 自带的 jstack 和 jmap 也可以用来分析 Core dump(补充下还有jinfo):

jstack
jmap
jinfo

这里的 指的是你运行 Java 程序时使用的 java, 一般可以用 $JAVA_HOME/bin/java 代替. 如果你指定的 java 和你运行用的 java 不是同一个版本, 就会抛出 sun.jvm.hotspot.debugger.UnmappedAddressException.

另外你使用的 jstack 和 jamp 也需要是相应的版本, 否则会提示 Can’t attach to the core file.

问题

jmap /usr/local/jdk/jdk1.8.0_73/bin/java core.dump.2878

或者

$JAVA_HOME/bin/java -jar xxx.jar 
$JAVA_HOME/bin/jstack  8419 >  core.8419
$JAVA_HOME/bin/jstack $JAVA_HOME/bin/java /var/crash/core.18470

image-20200104090610741

网上描述出现这种错误的原因都是java环境不同意导致的。
https://blog.csdn.net/liyf155/article/details/65628209

如上我通过这种方式还是不行,已经保证了,所有的java地址都是统一的还是不行。
还有人说是超过2G的core文件就不行了,我看了一下我的只有几百k
https://blog.csdn.net/mynamepg/article/details/81670358
如下图:

image-20200104114206948

综上所述,这个问题,我倒现在都没有解决,希望知道问题的盆友可以私信我哈~

转自:

http://yoncise.com/2017/05/23/Java-Heap-Dump-Thread-Dump-and-Core-Dump/

https://www.cnblogs.com/wuzhiyuan/p/9605456.html

Aix系统篇

aix系统如何生成这些个dump文件呢?

生成

Kill -3

kill -3 pid

必须在jvm运行前加上参数:

-Xdump:java heap system snap:events=user

kill -3 生成的dmp txt文件到特定的目录,则需要配置如下的环境变量。(其他格式的文件自行查询,因为这里只需要dmp文件,所以目前先这样)

export IBM_JAVACOREDIR=/dumpfile
export IBM_COREDIR=/dumpfile

java -Xrunhprof(内存泄漏分析)

java -Xrunhprof:heap=dump,format=b,file=java.hprof -jar tomcat_jvm_thread_demo-1.0-SNAPSHOT.jar

演示一下:
通过这种方式启动,然后ctrl c停止可以看到heap。。。done
Tomcat、weblogic、jboss等应该是一样的配置jvm参数,这里我只是用了一个简单的例子

ps:切记,不要通过kill -9 停止,不行的我试过,应该是这样瞬间停止会把hprof文件损坏

image-20200104140543634

在当前的目录下ls

image-20200104140820313

看到生成了这个文件然后下载到本地,通过MAT等软件进行查看
官方文档:
java -Xrunhprof https://www.ibm.com/support/knowledgecenter/zh/SSYKE2_8.0.0/com.ibm.java.80.doc/diag/tools/hprof.html

分析

jextract

jextract xxx.dmp -nozip

这里的dum是上面生成的dmp文件,注意一定要加入-nozip参数,否则无法生成xml文件,下面的指令无法执行

jdmpview
有一个命令格式

jdmpview -outfile out.txt [-overwrite|-append] -cmdfile commands.txt -core <path to core file>

/usr/java6_64/bin/jdmpview  -core core.20191205.210332.3932390.0009.dmp   </leesin/commands.txt >/leesin/out.txt

commands.txt 中内容是info class,最后就会在out.txt中保存着和jmap分析类占用内存信息一样的东西了
当然这种是简便方式,其实完整的是

//注意这里的jdmpview最好写全路径
/usr/java6_64/bin/jdmpview -core core.20191205.210332.3932390.0009.dmp   

然后会跳出弹框,让输入子命令,如果希望查看类占红内存信息呢就输入info class即可,其他的可以查看官方文档或者子命令help

jdmpView的官方文档:https://www.ibm.com/support/knowledgecenter/SSYKE2_7.0.0/com.ibm.java.lnx.70.doc/diag/tools/dump_viewer_dtfjview/dump_viewer.html
Stack Overflow:https://stackoverflow.com/questions/5576672/force-or-generate-jvm-core-dump-ibm-jvm
另一种jdmpview:https://blog.csdn.net/iteye_2535/article/details/81848367
关于更多jextract的命令详解可以看一下这个博客(包括kill -3能够生成的文件的详解,很不错的文章):http://blog.itpub.net/14710393/viewspace-754352/
批处理页面:https://www.ibm.com/support/knowledgecenter/SSYKE2_7.0.0/com.ibm.java.lnx.70.doc/diag/tools/dump_viewer_dtfjview/dump_viewer_batch_mode.html
重定向的需要在写代码的时候重点考虑下:https://blog.csdn.net/qq_26765193/article/details/83189393
添加kill -3的重定向文件目录的环境变量。
https://www.ibm.com/support/pages/ibm-java-aix-mustgather-data-collection-procedure-java-jit-issues(主要看这个)
https://developer.ibm.com/answers/questions/211533/i-want-to-create-heapdumps-from-was-in-tip-but-i-c/
https://www.ibm.com/support/pages/websphere-application-server-dump-locations-and-setup
https://www.suse.com/support/kb/doc/?id=7012623
https://www.ibm.com/support/pages/changing-location-javacore-heapdump-and-core-file-generated-tip

MAT

导入当菜上面生成的hprof文件

image-20200104140405319

IBM Monitoring and Diagnostic Tools

java -Xrunhprof的官方文档: https://www.ibm.com/support/knowledgecenter/zh/SSYKE2_8.0.0/com.ibm.java.80.doc/diag/tools/hprof.html

在这个官方文档中找到线索:

image-20200104141004057

使用 IBM Monitoring and Diagnostic Tools:https://www.ibm.com/support/knowledgecenter/zh/SSYKE2_8.0.0/com.ibm.java.80.doc/diag/tools/healthcenter.html
官方文档中:

image-20200104141119349

可以看到是jdmpview的GUI方式,也许这个工具真的是最适用于IBM jdk的工具了。
但是我没有去深究,因为MAT已经能够帮助我解决问题了

详文

写过一个完整的通过aix系统分析内存泄漏的文章:

链接:https://blog.csdn.net/dataiyangu/article/details/103429954

引用

JAVACORE篇:

BM JDK:V9

  1. 系统宕机自动生成。
    IBM的JDK在系统宕机的时候会自动生成javacore,这也是我们经常用该JDK替换默认的缘故。

  2. 工具。

  3. ctrl break组合键。

  4. NMC控制台。
    NC自带的监控工具NMC可以直接点击对应server,右键直接生成javacore。
    该工具只针对于Websphere集群生效。对于单机 websphere或者NC中间件不生效。

    img

  5. Websphere控制台。
    有的时候我们发现,系统卡死,或者需要同时生成多个Server的javacore的时候,
    我们就需要在websphere的控制台中直接生成。生成方式为Troubleshooting->Java dumps and cores。

img

  1. JSP小补丁程序。         
    该程序是自己编写的jsp小程序。
    使用方式为,将javacore.jsp放置到nchome/hotwebs/nc_web下即可,重启生效。
    访问的时候,通过ip地址 端口 javacore.jsp即可在JAVA_HOME中生成。
    如127.0.0.1:9081/javacore.jsp。补丁在附件中。
    主要调用IBM的JDK内部方法com.ibm.jvm.Dump.JavaDump();

作者:小漠穷秋
链接:https://www.jianshu.com/p/37b1b32bc6f3
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

HEAPDUMP篇:

IBM JDK:V9

1.系统宕机自动生成。
2.利用coredump功能。
利用websphere自带的coredump功能,可以将所有宕机时的堆栈信息全部输出。
包含堆中对象的具体信息,如hashmap中的键值都可以看到具体的值。
是跟踪宕机问题的终极法宝。
具体方法为,在JVM中添加参数: - -Xdump:system:events=user,request=exclusive prewalk compact
3.JSP小补丁程序。
该程序是自己编写的jsp小程序。
使用方式为,将heapdump.jsp放置到nchome/hotwebs/nc_web下即可,重启生效。
访问的时候,通过ip地址 端口 heapdump.jsp即可在JAVA_HOME中生成。
如127.0.0.1:9081/heapdump.jsp。补丁在附件中。
主要调用IBM的JDK内部方法com.ibm.jvm.Dump.HeapDump();

作者:小漠穷秋
链接:https://www.jianshu.com/p/37b1b32bc6f3
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


Java糖果罐
扫码关注
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: javacore文件Java虚拟机生成的一种文本文件,它记录了Java应用程序在运行过程中的线程堆栈信息、锁信息、内存使用情况等。它通常用于分析Java应用程序的性能问题和调试。 heapdump文件Java虚拟机生成的一种二进制文件,它记录了Java应用程序在运行过程中的堆内存使用情况。它通常用于分析Java应用程序的内存泄漏和内存溢出问题。 ### 回答2: Javacore文件和Heapdump文件是两种不同类型的Java虚拟机(JVM)诊断文件Javacore文件是一种详细描述JVM线程状态和系统信息的文件。当JVM遇到致命错误或自然死亡时,它会自动创建Javacore文件。此文件列出了所有线程的状态,包括等待、运行和阻塞状态。还包括实时统计信息、堆栈跟踪和Java虚拟机配置信息等。这些信息对于诊断和修复JVM问题非常有用,例如内存泄漏、死锁、无响应等。 Heapdump文件是另一种JVM诊断文件,用于描述JVM的堆内存信息。当JVM内存达到一定限制或开发人员手动请求时,它会自动创建Heapdump文件。此文件包含了所有当前分配的对象和它们所占用的堆内存大小。它可用于分析内存泄露或内存占用量过高等问题。通过分析Heapdump文件,可以确定哪些对象占用了大量内存并进行相应的调整。 总体来说,Javacore和Heapdump文件都是非常有用的JVM诊断工具,可以用于分析和解决JVM问题。它们为开发人员提供了深入了解JVM运行时信息的机会,并帮助他们识别和消除潜在的性能问题。 ### 回答3: JavaCore和HeapDump文件Java程序开发中常用的两种类型的文件JavaCore是指Java进程在崩溃后生成的核心转储文件,而HeapDump则是指Java进程中的堆内存转储文件。这两种文件在程序调试和性能优化中都有重要的作用。 JavaCore文件Java进程崩溃时生成的核心转储信息,可以用于分析崩溃的原因。JavaCore文件中包含了关于崩溃时程序的状态信息,如进程中活动的线程、线程的堆栈信息、内存的使用情况等。开发人员可以通过分析JavaCore文件来确定崩溃的根本原因,是由于代码错误还是由于内存溢出等问题。 HeapDump文件则是Java虚拟机在程序运行时生成的堆内存转储信息,用来分析Java程序的内存使用情况,可以帮助开发人员找出程序中的内存泄漏和对象的引用循环等问题。因为Java虚拟机的垃圾回收机制会自动回收不再使用的内存,所以开发人员需要及时分析HeapDump文件,找出那些占用大量内存且无法被回收的对象,以避免程序的内存溢出或内存泄漏等问题。 在实际开发中,JavaCore和HeapDump文件都扮演着非常重要的角色,可以帮助开发人员快速诊断和解决程序中出现的问题。因此,开发人员需要学会如何生成和分析这两种类型的文件,并及时修复程序中出现的问题,以提高程序的稳定性和性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值