TroubleshootingGuide for JavaTM SE 6withHotSpot TM VM (翻译附录未完待续)-2
本节主要描述当JVM crash时候线程的信息。如果多线程在同一时刻crash,只有一个线程的信息会被打印出来。
C.4.1 线程信息
线程部分第一部分描述了引起严重错误的线程信息,如下所示:
Current thread (0x0805ac88): JavaThread "main" [_thread_in_native, id=21139]
| | | | +-- ID线程ID
| | | +------------- state线程状态
| | +-------------------------- name线程名称
| +------------------------------------ type线程类型
+--------------------------------------------------pointer计数器
线程计数器是指向JVM内部线程结构,如果你不想调试正在运行的JVM或者core文件的话,则该指针没有什么用处。
下面列出了可能的JVM线程类型
JavaThread
VMThread
CompilerThread
GCTaskThread
WatcherThread
ConcurrentMarkSweepThread
译注:具体线程含义还需要查看Oracle官方文档,但是具体也能见名知意。
下面列举了线程可能的状态:
线程 描述
_thread_uninitialized 线程没有创建,这只会出现在内存错误的前提下
_thread_new 线程被创建了,但是没有被start
_thread_in_native 线程运行在本地方法中,这意味着可能在本地代码存在Bug
_thread_in_vm 线程运行JVM代码
_thread_in_Java 线程运行在解释模式或者编译模式Java代码
_thread_blocked 线程被阻塞
_thread_trans 如果上面任何状态后面跟着这个标志,意味着线程在改变运行状态
在该输出中的线程ID代表一个本地线程标识(注:这应该jmm里面的,目前没到那种程度分析)
如果Java线程是dameon的话,则dameon会在线程状态前打印
C.4.2 信号信息
在错误日志下一部分信息是导致JVM终止的信号信息,在Windows平台下,输出如下所示:
siginfo: ExceptionCode=0xc0000005, reading address 0xd8ffecf1
在上述例子中,错误码是0xc0000005(ACCESS_VIOLATION),并且错误发生在线程试图读取地址
0xd8ffecf1
在Solaris或者Linux系统中,信号数字和信号码(这个有点糊涂)被用来识别异常信息,如下所示:
siginfo:si_signo=11, si_errno=0, si_code=1, si_addr=0x00004321
C.4.3 寄存器内容
错误日志的下一部分描述了错误发生时候寄存器的内容,具体输出格式和硬件架构相关,下面的例子描述在IA32下的输出内容:
Registers:
EAX=0x00004321, EBX=0x41779dc0, ECX=0x080b8d28, EDX=0x00000000
ESP=0xbfffc1e0, EBP=0xbfffc1f8, ESI=0x4a6b9278, EDI=0x0805ac88
EIP=0x417789d7, CR2=0x00004321, EFLAGS=0x00010216
寄存器内容可以和即将描述的指令结合起来,这是十分有用的对于指令排查
C.4.4 指令
在输出寄存器值后,错误日志包含了栈顶上的指令集合(128个字节码操作集合)在程序计数器PC附近,当JVM崩溃的时候。这些字节码可以被汇编器解码成对应的字节码指令,注意IA32和AMD64指令在长度上不一致,因此并不是每次都能解码成功(注:难道AMD64上有可能解析不出来?)
Top of Stack: (sp=0xbfffc1e0)
0xbfffc1e0: 00000000 00000000 0818d068 00000000
0xbfffc1f0: 00000044 4a6b9278 bfffd208 41778a10
0xbfffc200: 00004321 00000000 00000cd8 0818d328
0xbfffc210: 00000000 00000000 00000004 00000003
0xbfffc220: 00000000 4000c78c 00000004 00000000
0xbfffc230: 00000000 00000000 00180003 00000000
0xbfffc240: 42010322 417786ec 00000000 00000000
0xbfffc250: 4177864c 40045250 400131e8 00000000
Instructions: (pc=0x417789d7)
0x417789c7: ec 14 e8 72 ff ff ff 81 c3 f2 13 00 00 8b 45 08
0x417789d7: 0f b6 00 88 45 fb 8d 83 6f ee ff ff 89 04 24 e8
C.4.5 线程堆栈
大部分情况下,错误日志的下一部分是线程堆栈,这包含栈帧的栈顶和栈底也就是SP和BP的地址,当前栈指针(这个稍微有点不明白),以及没有被当前线程使用堆栈内存数量。随后的就是栈帧的详细调用信息,最多100个栈帧会被打印出来。对于C/C++栈帧,库名也会被打印出来。需要记住的是,在某些错误情形下,栈帧可能已经破损,因此相应的详细信息可能不会被完全打印出来。
Stack: [0x00040000,0x00080000), sp=0x0007f9f8, free space=254k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [jvm.dll+0x83d77]
C [App.dll+0x1047]
j Test.foo()V+0
j Test.main([Ljava/lang/String;)V+0
v ~StubRoutines::call_stub
V [jvm.dll+0x80f13]
V [jvm.dll+0xd3842]
V [jvm.dll+0x80de4]
C [java.exe+0x14c0]
C [java.exe+0x64cd]
C [kernel32.dll+0x214c7]
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j Test.foo()V+0
j Test.main([Ljava/lang/String;)V+0
v ~StubRoutines::call_stub
上面的日志包含两类线程堆栈栈帧
1、第一种是本地栈帧,它会打印出本地线程所有的方法调用,然而这类线程堆栈并没有把运行时inline的Java方法包括进去,因此如果方法被inline的话,则该方法会成为父栈帧的一部分。
在本地栈帧中的方法信息为调查JVM crash提供了重要的信息,通过分析上述列表中列举的库名称,你能够推断出那个库导致错误出现,并且将该信息报告给库的开发人员。
2、第二种是Java堆栈,这会打印出Java方法堆栈包括inline的方法,不包含本地堆栈,根据crash的结果,有可能打不出本地堆栈,而打出Java堆栈
C.4.6 进一步的信息
如果错误发生在VM线程或者一个compile线程中,更进一步的信息会被打印出来。例如,考虑VM线程的情况,如果VM线程正在执行一个VM操作的时候,如果此时错误发生,则该操作会被打印出来。在下面的输出例子中,compiler线程触发了一个错误,此时HotSpot client虚拟机正在编译一个方法,方法是hs101t004Thread.ackermann
Current CompileTask:
HotSpot Client Compiler:754 b
nsk.jvmti.scenarios.hotswap.HS101.hs101t004Thread.ackermann(IJ)J (42 bytes)
对于HotSpot Server虚拟机,该compile线程输出的结果略微不同,但也会包含完整的类名和方法名称。
译注:这节翻译的很晦涩,有些概念自己理解的也是模棱两可,望大家见谅和指正。
转载于:https://www.cnblogs.com/diyunpeng/archive/2012/03/05/2380539.html
TroubleshootingGuide for JavaTM SE 6withHotSpot TM VM (翻译附录未完待续)-2相关推荐
- PEP 0498 -- Literal String Interpolation 翻译(未完待续)
2019独角兽企业重金招聘Python工程师标准>>> 在Python中支持多种的text字符串格式化.包括%方式,str.format()和string.Template.每种方法 ...
- 尚学堂java SE学习笔记(未完待续)
1.关于递归,一定要注意函数调用顺序! 图1 如上图:在执行f(n-1)+f(n-2)的过程中,先执行f(n-1)一直到f(n-1)有返回值才执行f(n-2). 2. 图2 注意成员变量和局部变量的 ...
- 考研英语 各种阅读/翻译/新题型/完形填空技巧
本文内容为考研英语 各种阅读/翻译/新题型/完形填空技巧,源文件已经上传到我的资源中,有需要的可以去看看, 我主页中的思维导图中内容大多从我的笔记中整理而来,相应技巧可在笔记中查找原题, 有兴趣的可以 ...
- PDF如何翻译?看完这个方法就学会了
PDF如何翻译?很多朋友在工作过程中应该都会见到过英文资料的PDF文件,或者有些PDF资料下载下来发现内容都是英文的,遇到这种情况如果一句一句去搜查翻译会比较麻烦,那么有没有一种方法可以直接进行翻译呢 ...
- 不知道如何进行图片文字翻译?看完这篇你就知道了
由于工作需要,有些小伙伴们经常会接收或发送图片.如果你收到对方发来的一张外文图片,可是看不懂是什么意思,你是怎么做的?一字一句去翻译吗?这样耗时又耗力的工作,会让我们的工作效率大打折扣.其实我们只 ...
- Oppo手机自带翻译功能你知道吗?一键实时语音翻译,看完学到了
OPPO手机这两年的发展特别迅猛,而凭借着Reno和R系列吸粉无数,但是你知道吗?oppo手机吸引用户的不仅仅是外观和自拍,还有它特别好用的系统,就比如翻译这个功能,oppo手机自带的功能就能帮你轻松 ...
- oracle 自带 实时同步功能吗_Oppo手机自带翻译功能你知道吗?一键实时语音翻译,看完学到了...
OPPO手机这两年的发展特别迅猛,而凭借着Reno和R系列吸粉无数,但是你知道吗?oppo手机吸引用户的不仅仅是外观和自拍,还有它特别好用的系统,就比如翻译这个功能,oppo手机自带的功能就能帮你轻松 ...
- TensorFlow 白皮书的翻译(未翻译完请绕行)
TensorFlow:Large-Scale Machine Learning on Heterogeneous Distributed Systems 大型机器学习异构分布式系统 最近,正在初学Te ...
- ISA95.PART4翻译整理 制造运营管理的对象和属性(未完)
ISA 95.00.04 4.2 制造运营管理活动之间的信息交换网络 6. 工作定义信息 Work definition information 6.1. 工作定义模型 执行特定一次工作所需的资源和工 ...
最新文章
- Python基础知识(第四天)
- php购物系统论文答辩老师评价,答辩指导教师的评语大全
- Leetcode 141. Linked List CycleJAVA语言
- 短时傅里叶分析:spectrogram函数
- java bom json,JSON字符串带BOM头ufeff
- CodeForces 560A,B,C
- N次剩余(详解+例题+代码)
- 学习一下spring-cloud-function中官方修复的一个问题
- python从文件中读取数据时出现错误_python-从文件中读取数据
- C# Azure 存储-队列
- Ztree 改 节点
- mysql like 多个条件_MySQL之用通配符进行过滤
- 解决红蜘蛛教师端教师图标显示灰色导致无法广播的问题
- ps蒙版上渐变工具的使用及抠图方法
- 大数据hive篇--同比环比
- java背单词软件_求背英语单词的手机JAVA软件
- VRChat模型上传需要注意些什么?
- MIT 操作系统 jos make grade出现no jos.out
- 实现简单的三D立方体自动旋转
- 清理kdevtmpfsi、dbused挖矿木马程序
热门文章
- mysql 从库 read only_mysql salve从库设置read only 属性
- 常见排序算法详解 (收藏!)
- Linux C 的风格
- linux libodbc.so.1,CentOS6.0虚拟机上安装nginx启动的错误---缺少libpcre.so.1共享库
- Linux命令(2)—— 如何切换当前目录
- CF-1207 F. Remainder Problem(分块)
- c++ multimap的几个insert插入元素简单例子
- 清除ubuntu下缓存、软件安装包和多余内核
- java list 拆分_Java面试题怎么确保一个集合不能被修改?
- weblogic12 linux部署,linux系统中安装部署weblogic12.1.3