Java heap dump & shut down - what order?
I would rather rely on calling into a script that handles the ordering more deterministically i.e.
-XX:OnOutOfMemoryError="/<SomeStandardLocation>/heapAndQuit.sh"
heapAndQuit.sh will then employ a method to find the pid
of the current process.
One simple way to identify the pid is to use the log file location your process is writing to
lsof | grep /var/tmp/<yourlogfileName> | cut -d " " -f1 | uniq
I will then use jmap
to dump and kill -9
subsequently
If you are using OpenJDK you can be sure when you are going to run the command set by -XX:OnOutOfMemoryError option.
Code taken from the OpenJDK source code. See: debug.cpp
void report_java_out_of_memory(const char* message) {
static jint out_of_memory_reported = 0;
// A number of threads may attempt to report OutOfMemoryError at around the
// same time. To avoid dumping the heap or executing the data collection
// commands multiple times we just do it once when the first threads reports
// the error.
if (Atomic::cmpxchg(1, &out_of_memory_reported, 0) == 0) {
// create heap dump before OnOutOfMemoryError commands are executed
if (HeapDumpOnOutOfMemoryError) {
tty->print_cr("java.lang.OutOfMemoryError: %s", message);
HeapDumper::dump_heap_from_oome();
}
if (OnOutOfMemoryError && OnOutOfMemoryError[0]) {
VMError err(message);
err.report_java_out_of_memory();
}
}
}
Just in case a short explanation:
- First of all check if the HeapDumpOnOutOfMemoryError option was set. In that case run dump_heap_from_oome()
- Sencondly if the OnOutOfMemoryError option was set, run report_java_out_of_memory()
So, for sure if you are using OpenJDK your process will dump memory and then quit.