Java最全关于javacore和dump文件,最详细的docker中安装并配置redis

Java面试核心知识点笔记

其中囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。

蚂蚁金服(Java研发岗),26岁小伙斩获三面,收获Offer定级P6

Java中高级面试高频考点整理

蚂蚁金服(Java研发岗),26岁小伙斩获三面,收获Offer定级P6

蚂蚁金服(Java研发岗),26岁小伙斩获三面,收获Offer定级P6

最后分享Java进阶学习及面试必备的视频教学

蚂蚁金服(Java研发岗),26岁小伙斩获三面,收获Offer定级P6

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

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

/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

引用


最后希望可以帮助到大家!

千千万万要记得:多刷题!!多刷题!!

之前算法是我的硬伤,后面硬啃了好长一段时间才补回来,算法才是程序员的灵魂!!!!

篇幅有限,以下只能截图分享部分的资源!!

(1)多线程(这里以多线程为代表,其实整理了一本JAVA核心架构笔记集)

image

(2)刷的算法题(还有左神的算法笔记)

image

(3)面经+真题解析+对应的相关笔记(很全面)

image

(4)视频学习(部分)

ps:当你觉得学不进或者累了的时候,视频是个不错的选择

在这里,最后只一句话:祝大家offer拿到手软!!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

伤,后面硬啃了好长一段时间才补回来,算法才是程序员的灵魂!!!!

篇幅有限,以下只能截图分享部分的资源!!

(1)多线程(这里以多线程为代表,其实整理了一本JAVA核心架构笔记集)

[外链图片转存中…(img-Wytqll5a-1715338569459)]

(2)刷的算法题(还有左神的算法笔记)

[外链图片转存中…(img-vYbysZCj-1715338569459)]

(3)面经+真题解析+对应的相关笔记(很全面)

[外链图片转存中…(img-cXOqU2Kf-1715338569460)]

(4)视频学习(部分)

ps:当你觉得学不进或者累了的时候,视频是个不错的选择

在这里,最后只一句话:祝大家offer拿到手软!!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值