TroubleshootingGuide for JavaTM SE 6withHotSpot TM VM (翻译附录未完待续)-2
生活随笔
收集整理的這篇文章主要介紹了
TroubleshootingGuide for JavaTM SE 6withHotSpot TM VM (翻译附录未完待续)-2
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C.4 線程部分格式
本節主要描述當JVM crash時候線程的信息。如果多線程在同一時刻crash,只有一個線程的信息會被打印出來。
線程部分第一部分描述了引起嚴重錯誤的線程信息,如下所示:
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會在線程狀態前打印
在錯誤日志下一部分信息是導致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
錯誤日志的下一部分描述了錯誤發生時候寄存器的內容,具體輸出格式和硬件架構相關,下面的例子描述在IA32下的輸出內容:
Registers:
EAX=0x00004321, EBX=0x41779dc0, ECX=0x080b8d28, EDX=0x00000000
ESP=0xbfffc1e0, EBP=0xbfffc1f8, ESI=0x4a6b9278, EDI=0x0805ac88
EIP=0x417789d7, CR2=0x00004321, EFLAGS=0x00010216
寄存器內容可以和即將描述的指令結合起來,這是十分有用的對于指令排查
在輸出寄存器值后,錯誤日志包含了棧頂上的指令集合(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
大部分情況下,錯誤日志的下一部分是線程堆棧,這包含棧幀的棧頂和棧底也就是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堆棧
如果錯誤發生在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線程輸出的結果略微不同,但也會包含完整的類名和方法名稱。
譯注:這節翻譯的很晦澀,有些概念自己理解的也是模棱兩可,望大家見諒和指正。
本節主要描述當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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows7IIS7.5部署Disc
- 下一篇: Cucumber入门之_argument