HotSpot が異常終了する際のエラー通知作業で使われる補助クラス(StackObjクラス).
デフォルトでは, 標準出力 (defaultStream::output_fd()) に簡単なエラーメッセージを出した後,
エラーレポートファイル ("hs_err_pid
なお複数のスレッドから同時に使用された場合でも実際の出力処理は一人しか実行できない (残りのスレッドは VMError::report_and_die() 内でブロックされたままアボートすることになる).
((cite: hotspot/src/share/vm/utilities/vmError.cpp))
// Fatal error handler for internal errors and crashes.
//
// The default behavior of fatal error handler is to print a brief message
// to standard out (defaultStream::output_fd()), then save detailed information
// into an error report file (hs_err_pid<pid>.log) and abort VM. If multiple
// threads are having troubles at the same time, only one error is reported.
// The thread that is reporting error will abort VM when it is done, all other
// threads are blocked forever inside report_and_die().
((cite: hotspot/src/share/vm/utilities/vmError.hpp))
class VMError : public StackObj {
HotSpot 内の様々なエラー発生箇所で VMError::report_and_die() が呼び出されている (この関数内で端末や hs_err_pid*.log ファイルへの出力が行われる).
((cite: hotspot/src/share/vm/utilities/vmError.hpp))
// main error reporting function
void report_and_die();
出力先は OnError オプションで変更することもできる.
(他のコマンドにパイプで出力をつなぐ等, 少し凝ったこともできる模様)
((cite: hotspot/src/share/vm/utilities/vmError.cpp))
// -XX:OnError=<string>, where <string> can be a list of commands, separated
// by ';'. "%p" is replaced by current process id (pid); "%%" is replaced by
// a single "%". Some examples:
//
// -XX:OnError="pmap %p" // show memory map
// -XX:OnError="gcore %p; dbx - %p" // dump core and launch debugger
// -XX:OnError="cat hs_err_pid%p.log | mail my_email@sun.com"
// -XX:OnError="kill -9 %p" // ?#!@#
See: here for details
VMError クラス内で使用される補助クラス.
OnOutOfMemoryError オプションで指定されたコマンドを fork-and-exec するためのクラス (なお, OnOutOfMemoryError オプションは OutOfMemoryError が起きた際に実行するコマンドを指定するオプション).
((cite: hotspot/src/share/vm/utilities/vmError.cpp))
/*
* OnOutOfMemoryError scripts/commands executed while VM is a safepoint - this
* ensures utilities such as jmap can observe the process is a consistent state.
*/
class VM_ReportJavaOutOfMemory : public VM_Operation {
VMError::report_java_out_of_memory() 内で(のみ)使用されている.
(VMError::report_java_out_of_memory() は OutOfMemoryError が起こった際に呼び出される関数. なお, この関数が呼ばれてもその場で異常終了するわけではなく, この関数の呼び元では(呼び元は複数あるがどこでも), その後普通に OutOfMemoryError に対する例外ハンドリング処理が行われる.)
See: here for details
行う処理は, コマンドラインオプションを取得して os::fork_and_exec() しているだけ.
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.