日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

TroubleshootingGuide for JavaTM SE 6withHotSpot TM VM (翻译附录未完待续)-2

發布時間:2024/4/17 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TroubleshootingGuide for JavaTM SE 6withHotSpot TM VM (翻译附录未完待续)-2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C.4 線程部分格式

本節主要描述當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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。