java 转储快照分析

在本文中,我将向您展示如何调试Java核心文件,以查看导致JVM崩溃的原因。 我将使用在上一篇文章: 生成Java Core Dump中生成的核心文件。 您可以通过以下几种方法来诊断JVM崩溃:

hs_err_pid日志文件

当JVM中发生致命错误时,通常会在进程的工作目录或操作系统的临时目录中生成一个名为hs_err_pidXXXX.log的错误日志文件。 该文件的顶部包含崩溃的原因和“问题框架”。 例如,我的节目显示:

$ head hs_err_pid21178.log
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x0000002b1d00075c, pid=21178, tid=1076017504
#
# JRE version: 6.0_21-b06
# Java VM: Java HotSpot(TM) 64-Bit Server VM (17.0-b16 mixed mode linux-amd64 )
# Problematic frame:
# C  [libnativelib.so+0x75c]  bar+0x10
#

还有一个堆栈跟踪:

Stack: [0x000000004012b000,0x000000004022c000],  sp=0x000000004022aac0,  free space=3fe0000000000000018k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [libnativelib.so+0x75c]  bar+0x10
C  [libnativelib.so+0x772]  foo+0xe
C  [libnativelib.so+0x78e]  Java_CoreDumper_core+0x1a
j  CoreDumper.core()V+0
j  CoreDumper.main([Ljava/lang/String;)V+7
v  ~StubRoutines::call_stub
V  [libjvm.so+0x3e756d]

堆栈跟踪显示我的Java方法CoreDumper.core()调用到JNI中,并在以本机代码调用bar函数时死亡。

调试Java核心转储

在某些情况下,例如,如果本机代码通过调用abort函数突然中止,则JVM可能不会生成hs_err_pid文件。 在这种情况下,我们需要分析产生的核心文件。 在我的机器上,操作系统将核心文件写到/var/tmp/cores 。 您可以使用以下命令查看将系统配置为将核心文件写到的位置:

$ cat /proc/sys/kernel/core_pattern
/var/tmp/cores/%e.%p.%u.core
$ ls /var/tmp/cores
java.21178.146385.core

有几种不同的方法可以查看核心转储:

1.使用gdb

GNU调试器(gdb)可以检查核心文件,并确定程序崩溃时正在做什么。

$ gdb $JAVA_HOME/bin/java /var/tmp/cores/java.14015.146385.core
(gdb) where
#0  0x0000002a959bd26d in raise () from /lib64/tls/libc.so.6
#1  0x0000002a959bea6e in abort () from /lib64/tls/libc.so.6
#2  0x0000002b1cecf799 in bar () from libnativelib.so
#3  0x0000002b1cecf7a7 in foo () from libnativelib.so
#4  0x0000002b1cecf7c3 in Java_CoreDumper_core () from libnativelib.so
#5  0x0000002a971aac88 in ?? ()
#6  0x0000000040113800 in ?? ()
#7  0x0000002a9719fa42 in ?? ()
#8  0x000000004022ab10 in ?? ()
#9  0x0000002a9a4d5488 in ?? ()
#10 0x000000004022ab70 in ?? ()
#11 0x0000002a9a4d59c8 in ?? ()
#12 0x0000000000000000 in ?? ()

where命令打印堆栈帧,并显示导致崩溃的bar函数abort()

2.使用jstack

jstack打印给定核心文件的Java线程的堆栈跟踪。

$ jstack -J-d64 $JAVA_HOME/bin/java /var/tmp/cores/java.14015.146385.core
Debugger attached successfully.
Server compiler detected.
JVM version is 17.0-b16
Deadlock Detection:No deadlocks found.Thread 16788: (state = BLOCKED)Thread 16787: (state = BLOCKED)- java.lang.Object.wait(long) @bci=0 (Interpreted frame)- java.lang.ref.ReferenceQueue.remove(long) @bci=44, line=118 (Interpreted frame)- java.lang.ref.ReferenceQueue.remove() @bci=2, line=134 (Interpreted frame)- java.lang.ref.Finalizer$FinalizerThread.run() @bci=3, line=159 (Interpreted frame)Thread 16786: (state = BLOCKED)- java.lang.Object.wait(long) @bci=0 (Interpreted frame)- java.lang.Object.wait() @bci=2, line=485 (Interpreted frame)- java.lang.ref.Reference$ReferenceHandler.run() @bci=46, line=116 (Interpreted frame)Thread 16780: (state = IN_NATIVE)- CoreDumper.core() @bci=0 (Interpreted frame)- CoreDumper.main(java.lang.String[]) @bci=7, line=12 (Interpreted frame)

3.使用jmap

jmap检查核心文件并打印出共享对象内存映射或堆内存详细信息。

$ jmap -J-d64 $JAVA_HOME/bin/java /var/tmp/cores/java.14015.146385.core
Debugger attached successfully.
Server compiler detected.
JVM version is 17.0-b16
0x0000000040000000      49K     /usr/sunjdk/1.6.0_21/bin/java
0x0000002a9566c000      124K    /lib64/tls/libpthread.so.0
0x0000002a95782000      47K     /usr/sunjdk/1.6.0_21/jre/lib/amd64/jli/libjli.so
0x0000002a9588c000      16K     /lib64/libdl.so.2
0x0000002a9598f000      1593K   /lib64/tls/libc.so.6
0x0000002a95556000      110K    /lib64/ld-linux-x86-64.so.2
0x0000002a95bca000      11443K  /usr/sunjdk/1.6.0_21/jre/lib/amd64/server/libjvm.so
0x0000002a96699000      625K    /lib64/tls/libm.so.6
0x0000002a9681f000      56K     /lib64/tls/librt.so.1
0x0000002a96939000      65K     /usr/sunjdk/1.6.0_21/jre/lib/amd64/libverify.so
0x0000002a96a48000      228K    /usr/sunjdk/1.6.0_21/jre/lib/amd64/libjava.so
0x0000002a96b9e000      109K    /lib64/libnsl.so.1
0x0000002a96cb6000      54K     /usr/sunjdk/1.6.0_21/jre/lib/amd64/native_threads/libhpi.so
0x0000002a96de8000      57K     /lib64/libnss_files.so.2
0x0000002a96ef4000      551K    /lib64/libnss_db.so.2
0x0000002a97086000      89K     /usr/sunjdk/1.6.0_21/jre/lib/amd64/libzip.so
0x0000002b1cecf000      6K      /home/sharfah/tmp/jni/libnativelib.so

有用的链接:

JVM崩溃分析崩溃课程
生成Java核心转储

参考:从我们的JCG合作伙伴 Fahd Shariff的fahd.blog博客分析Java核心转储 。

翻译自: https://www.javacodegeeks.com/2013/02/analysing-a-java-core-dump.html

java 转储快照分析

java 转储快照分析_分析Java核心转储相关推荐

  1. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  2. java jmap 分析_利用java虚拟机的工具jmap分析java内存情况

    有时候碰到性能问题,比如一个java application出现out of memory,出现内存泄漏的情况,再去修改bug可能会变得异常复杂,利用工具去分析整个java application 内 ...

  3. java 检测硬盘原理_深入Java核心 Java内存分配原理精讲

    Java内存分配与管理是Java的核心技术之一,一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 ...

  4. java pdf插件下载_免费java pdf控件

    云原生的概念和理论体系非常的完备,but talk is cheap , show me the code ! 但是作为一名程序员,能动手的咱绝对不多BB,虽然talk并不cheap , 能跟不同层次 ...

  5. java技术入门培训_入门java怎么自学?推荐谁的课程?

    想要知道如何学习Java首先需要对她有一个大致的了解,Java是面向对象的编程语言,具有简单性.分布式.安全性.平台独立与可移植性.多线程.动态性等特点.现在多用于编写桌面应用程序.Web应用程序.分 ...

  6. java对象工厂池_[转载]Java对象池技术的原理及其实现

    作者:汪永好 出处:计算机与信息技术 责任编辑: 方舟 [ 2006-11-25 07:00 ] 摘 要 :本文在分析对象池技术基本原理的基础上,给出了对象池技术的两种实现方式.还指出了使用对象池技术 ...

  7. java序列化的方法_【Java常见序列化与反序列方法总结】

    人和电脑在很多方面都是十分相似的,大脑可以看成电脑主机,五官/身体等表面器官就是显示器.鼠标等外设.这篇文章就是想把计算机跟人做类比YY一下序列化和反序列化的机制.用途. 如果你是初学者,心里肯定会问 ...

  8. java使用外部库_在Java中使用外部库

    java使用外部库 Java附带了一组核心库,其中包括定义常用数据类型和相关行为的库,例如String或Date : 与主机操作系统进行交互的实用程序,例如System或File : 有用的子系统来管 ...

  9. java 7 锁优化_自Java 6/Java 7开始,Java虚拟机对内部锁的实现进行了一些优化。这些优化主要包括锁消除(Lock Elision)、锁粗化(Lock Coarse...

    自Java 6/Java 7开始,Java虚拟机对内部锁的实现进行了一些优化.这些优化主要包括锁消除(Lock Elision).锁粗化(Lock Coarsening).偏向锁(Biased Loc ...

最新文章

  1. java中rs怎么用_java-如何使用JAX-RS设置字符集?
  2. HCNE题库附件、可下载
  3. ITK:跟踪两个代码执行之间的内存费用
  4. 方立勋_30天掌握JavaWeb_Servlet事件监听器
  5. 9针串口定义测试方法_一些定义–测试技术9
  6. 《2018中国区块链行业分析报告》(50页PPT全文)
  7. 【算法1-2】排序(今天刷洛谷了嘛)
  8. docker 代理_利用Docker容器实现代理转发和数据备份
  9. 我与OTC的诸位大神
  10. 国际科学数据服务平台 - csdb_拔剑-浆糊的传说_新浪博客
  11. 【超图+CESIUM】【基础API使用示例】09、超图|CESIUM - 场景分屏设置
  12. 教你快速识别网络项目的骗术
  13. 荣耀V40用机技巧有哪些
  14. python 微博自动点赞_用 Python 自动定时发微博
  15. ROS入门之Publisher的创建
  16. 数据分析入门:初识数据埋点(一)
  17. vncserver: Wrong type or access mode
  18. 懒人煮紫菜蛋花青菜土豆汤
  19. auc 损失_无常收益(IG):DeFi无常损失(IL)问题的解决方案
  20. 打开扫描说是服务器正在运行,kis标准版9.1运行提示:金蝶kis标准版正在运行,请稍等...

热门文章

  1. 这可能是史上最全 Redis 高可用解决方案总结
  2. 这些棘手的Java面试题,答案你都知道吗?
  3. 数据库 - 事务管理(ACID)隔离级别 事务传播行为
  4. laravel构造器的CURD
  5. Vue及React脚手架安装
  6. JavaScript实现复选框全选与全不选的效果
  7. 微信消息提醒与消息数字提示之BadgeView
  8. mysql加索引快很多
  9. java凯撒密码_JAVA凯撒密码 选择问题
  10. java分布式对象(RMI+部署使用RMI的程序)