プロセス・セクションはスレッド・セクションのあとに出力されます。ここには、プロセスのスレッド・リストやメモリー使用状況など、プロセス全体に関する情報が含まれます。
スレッド・リストには、例A-12に示すように、VMが認識しているスレッドが含まれます。これには、すべてのJavaスレッドおよび一部のVM内部スレッドが含まれますが、例A-13に示すように、VMに接続していないユーザー・アプリケーションによって作成されたネイティブ・スレッドは含まれていません。
例A-12 スレッド・リスト形式の1行目
=>0x0805ac88 JavaThread "main" [_thread_in_native, id=21139] | | | | | +----- ID | | | | +------------------- state | | | | (JavaThread only) | | | +--------------------------------- name | | +------------------------------------------ type | +---------------------------------------------------- pointer +------------------------------------------------------ "=>" current thread
例A-13 エラー・ログのVM内部スレッド
Java Threads: ( => current thread ) 0x080c8da0 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=21147] 0x080c7988 JavaThread "CompilerThread0" daemon [_thread_blocked, id=21146] 0x080c6a48 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=21145] 0x080bb5f8 JavaThread "Finalizer" daemon [_thread_blocked, id=21144] 0x080ba940 JavaThread "Reference Handler" daemon [_thread_blocked, id=21143] =>0x0805ac88 JavaThread "main" [_thread_in_native, id=21139] Other Threads: 0x080b6070 VMThread [id=21142] 0x080ca088 WatcherThread [id=21148]
スレッド・タイプやスレッド状態については、「スレッド・セクションの形式」で説明されています。
その次の情報はVMの状態で、これは仮想マシン全体の状態を示します。表A-3は、一般的な状態を説明しています。
表A-3 VMの状態
一般的なVMの状態 | 説明 |
---|---|
|
通常の実行。 |
|
特殊なVM操作が完了するまで、VM内のすべてのスレッドがブロックされています。 |
|
特殊なVM操作が必要となったため、VM内のすべてのスレッドがブロックされるまでVMが待機しています。 |
VM状態の出力は次のように、エラー・ログ内で1行になります。
VM state:not at safepoint (normal execution)
エラー・ログ内のその次の情報は、例A-14に示すように、現在スレッドによって所有されている相互排他ロックとモニターのリストです。これらの相互排他ロックは、Javaオブジェクトに関連付けられたモニターではなく、VM内部のロックです。VMロックが保持された状態でクラッシュが発生した場合の出力を示す例を次に示します。ログにはロックごとに、ロックの名前、所有者、VM内部の相互排他ロック構造体のアドレス、およびそのOSロックのアドレスが含まれます。この情報は一般に、HotSpot VMにきわめて習熟したユーザーにしか役に立ちません。所有者スレッドはスレッド・リストと相互参照できます。
例A-15に示すように、その次の情報は、ヒープ・サマリーです。出力はガベージ・コレクション(GC)の構成に依存します。この例ではシリアル・コレクタが使用され、クラス・データ共有が無効にされ、Tenured世代が空になっています。これはおそらく、初期段階や起動中に致命的なエラーが発生し、GCがまだどのオブジェクトもTenured世代に昇格させていなかったことを示しています。
例A-15 エラー・ログのヒープ・サマリー
Heap def new generation total 576K, used 161K [0x46570000, 0x46610000, 0x46a50000) eden space 512K, 31% used [0x46570000, 0x46598768, 0x465f0000) from space 64K, 0% used [0x465f0000, 0x465f0000, 0x46600000) to space 64K, 0% used [0x46600000, 0x46600000, 0x46610000) tenured generation total 1408K, used 0K [0x46a50000, 0x46bb0000, 0x4a570000) the space 1408K, 0% used [0x46a50000, 0x46a50000, 0x46a50200, 0x46bb0000) compacting perm gen total 8192K, used 1319K [0x4a570000, 0x4ad70000, 0x4e570000) the space 8192K, 16% used [0x4a570000, 0x4a6b9d48, 0x4a6b9e00, 0x4ad70000) No shared spaces configured.
ログ内のその次の情報は、クラッシュ時の仮想メモリー領域のリストです。大きなアプリケーションの場合、このリストが長くなる可能性があります。メモリー・マップは一部のクラッシュをデバッグする際に非常に役立つ可能性がありますが、それは、実際に使用されていたライブラリやそのメモリー内での場所はもちろん、ヒープ、スタック、およびガード・ページの場所もわかるからです。
メモリー・マップの形式はオペレーティング・システムに固有です。Oracle Solarisオペレーティング・システムではベース・アドレスとライブラリ名が出力されます。Linuxシステムではプロセス・メモリー・マップ(/proc/pid/maps)が出力されます。Windowsシステムでは各ライブラリのベース・アドレスと終了アドレスが出力されます。例A-16は、Linux/x86で生成された出力を示しています。注意: この例では簡潔にするために、ほとんどの行が省略されています。
例A-16 エラー・ログ内の仮想メモリー領域のリスト
Dynamic libraries: 08048000-08056000 r-xp 00000000 03:05 259171 /h/jdk6/bin/java 08056000-08058000 rw-p 0000d000 03:05 259171 /h/jdk6/bin/java 08058000-0818e000 rwxp 00000000 00:00 0 40000000-40013000 r-xp 00000000 03:0a 400046 /lib/ld-2.2.5.so 40013000-40014000 rw-p 00013000 03:0a 400046 /lib/ld-2.2.5.so 40014000-40015000 r--p 00000000 00:00 0 Lines omitted. 4123d000-4125a000 rwxp 00001000 00:00 0 4125a000-4125f000 rwxp 00000000 00:00 0 4125f000-4127b000 rwxp 00023000 00:00 0 4127b000-4127e000 ---p 00003000 00:00 0 4127e000-412fb000 rwxp 00006000 00:00 0 412fb000-412fe000 ---p 00083000 00:00 0 412fe000-4137b000 rwxp 00086000 00:00 0 Lines omitted. 44600000-46570000 rwxp 00090000 00:00 0 46570000-46610000 rwxp 00000000 00:00 0 46610000-46a50000 rwxp 020a0000 00:00 0 46a50000-46bb0000 rwxp 00000000 00:00 0 46bb0000-4a570000 rwxp 02640000 00:00 0 Lines omitted.
例A-17 エラー・ログ内のメモリー・マップの形式
40049000-4035c000 r-xp 00000000 03:05 824473 /jdk1.5/jre/lib/i386/client/libjvm.so |<------------->| ^ ^ ^ ^ |<--------------------------------->| Memory region | | | | | | | | | | Permission --- + | | | | r: read | | | | w: write | | | | x: execute | | | | p: private | | | | s: share | | | | | | | | File offset ----------+ | | | | | | Major ID and minor ID of -------+ | | the device where the file | | is located (i.e. /dev/hda5) | | | | inode number ------------------------+ | | File name --------------------------------------------------+
例A-17に示されたメモリー・マップの出力では、各ライブラリに2つの仮想メモリー領域(コード用とデータ用に1つずつ)があります。コード・セグメントのアクセス権はr-xp
(読取り可能、実行可能、非公開)でマークされ、データ・セグメントのアクセス権はrw-p
(読取り可能、書込み可能、非公開)になります。
Javaヒープはすでに出力の前のほうのヒープ・サマリーに含まれていますが、ヒープ用に予約された実際のメモリー領域がヒープ・サマリーの値と一致することや、属性がrwxp
に設定されていることを確認することは、有用である可能性があります。
スレッド・スタックは通常、メモリー・マップ内で連続する2つの領域、具体的にはアクセス権が---p
の領域(ガード・ページ)とアクセス権がrwxp
の領域(実際のスタック領域)として表示されます。さらに、ガード・ページ・サイズやスタック・サイズを知ることは有用です。たとえばこのメモリー・マップでは、スタックの場所は4127b000から412fb000です。
Windowsシステムでは、例A-18に示すように、メモリー・マップの出力は、ロードされた各モジュールのロード・アドレスと終了アドレスになります。
例A-18 Windows上のメモリー・マップ
Dynamic libraries: 0x00400000 - 0x0040c000 c:\jdk6\bin\java.exe 0x77f50000 - 0x77ff7000 C:\WINDOWS\System32\ntdll.dll 0x77e60000 - 0x77f46000 C:\WINDOWS\system32\kernel32.dll 0x77dd0000 - 0x77e5d000 C:\WINDOWS\system32\ADVAPI32.dll 0x78000000 - 0x78087000 C:\WINDOWS\system32\RPCRT4.dll 0x77c10000 - 0x77c63000 C:\WINDOWS\system32\MSVCRT.dll 0x08000000 - 0x08183000 c:\jdk6\jre\bin\client\jvm.dll 0x77d40000 - 0x77dcc000 C:\WINDOWS\system32\USER32.dll 0x7e090000 - 0x7e0d1000 C:\WINDOWS\system32\GDI32.dll 0x76b40000 - 0x76b6c000 C:\WINDOWS\System32\WINMM.dll 0x6d2f0000 - 0x6d2f8000 c:\jdk6\jre\bin\hpi.dll 0x76bf0000 - 0x76bfb000 C:\WINDOWS\System32\PSAPI.DLL 0x6d680000 - 0x6d68c000 c:\jdk6\jre\bin\verify.dll 0x6d370000 - 0x6d38d000 c:\jdk6\jre\bin\java.dll 0x6d6a0000 - 0x6d6af000 c:\jdk6\jre\bin\zip.dll 0x10000000 - 0x10032000 C:\bugs\crash2\App.dll
エラー・ログ内のその次の情報は、例A-19に示すように、VM引数のリストと、それに続く環境変数のリストです。
例A-19 VM引数と環境変数のリスト
VM Arguments: java_command: NativeSEGV 2 Environment Variables: JAVA_HOME=/h/jdk PATH=/h/jdk/bin:.:/h/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin: /usr/dist/local/exe:/usr/dist/exe:/bin:/usr/sbin:/usr/ccs/bin: /usr/ucb:/usr/bsd:/usr/etc:/etc:/usr/dt/bin:/usr/openwin/bin: /usr/sbin:/sbin:/h:/net/prt-web/prt/bin USERNAME=user LD_LIBRARY_PATH=/h/jdk6/jre/lib/i386/client:/h/jdk6/jre/lib/i386: /h/jdk6/jre/../lib/i386:/h/bugs/NativeSEGV SHELL=/bin/tcsh DISPLAY=:0.0 HOSTTYPE=i386-linux OSTYPE=linux ARCH=Linux MACHTYPE=i386
注: この環境変数のリストは、Java VMに適用可能な環境変数の完全なリストではなく、その一部です。 |
Oracle SolarisおよびLinuxオペレーティング・システムでは、例A-20に示すように、エラー・ログ内のその次の情報はシグナル・ハンドラのリストです。
例A-20 エラー・ログ内のシグナル・ハンドラのリスト
Signal Handlers: SIGSEGV: [libjvm.so+0x3aea90], sa_mask[0]=0xfffbfeff, sa_flags=0x10000004 SIGBUS: [libjvm.so+0x3aea90], sa_mask[0]=0xfffbfeff, sa_flags=0x10000004 SIGFPE: [libjvm.so+0x304e70], sa_mask[0]=0xfffbfeff, sa_flags=0x10000004 SIGPIPE: [libjvm.so+0x304e70], sa_mask[0]=0xfffbfeff, sa_flags=0x10000004 SIGILL: [libjvm.so+0x304e70], sa_mask[0]=0xfffbfeff, sa_flags=0x10000004 SIGUSR1: SIG_DFL, sa_mask[0]=0x00000000, sa_flags=0x00000000 SIGUSR2: [libjvm.so+0x306e80], sa_mask[0]=0x80000000, sa_flags=0x10000004 SIGHUP: [libjvm.so+0x3068a0], sa_mask[0]=0xfffbfeff, sa_flags=0x10000004 SIGINT: [libjvm.so+0x3068a0], sa_mask[0]=0xfffbfeff, sa_flags=0x10000004 SIGQUIT: [libjvm.so+0x3068a0], sa_mask[0]=0xfffbfeff, sa_flags=0x10000004 SIGTERM: [libjvm.so+0x3068a0], sa_mask[0]=0xfffbfeff, sa_flags=0x10000004 SIGUSR2: [libjvm.so+0x306e80], sa_mask[0]=0x80000000, sa_flags=0x10000004