RFR: 8364090: Dump JFR recording on CrashOnOutOfMemoryError
Yasumasa Suenaga
ysuenaga at openjdk.org
Fri Jul 25 08:07:57 UTC 2025
On Fri, 25 Jul 2025 07:50:32 GMT, Erik Gahlin <egahlin at openjdk.org> wrote:
>> JFR emergency dump would happen when OOM was thrown. However it would not contain most recent `OldObjectSample` events emitted by LeakProfiler.
>>
>> I [reported this issue in past](https://mail.openjdk.org/pipermail/hotspot-jfr-dev/2019-January/000381.html), and it seems to be difficult to fix soon, and also JDK codebase has been updated in several years. It brings us to fix this issue easier than past.
>>
>> So I propose again to emit the events from LeakProfiler when OOM happened.
>> This change passed `jdk_jfr` tests on Linux x64 (excepts TestHeapSummaryEventPSParOld.java reported in [JDK-8364082](https://bugs.openjdk.org/browse/JDK-8364082))
>>
>> Related email thread: https://mail.openjdk.org/pipermail/hotspot-jfr-dev/2025-July/008007.html
>
> src/hotspot/share/runtime/java.cpp line 466:
>
>> 464: }
>> 465:
>> 466: JFR_ONLY(Jfr::on_vm_shutdown(true, halt);)
>
> You set oom to true here, why?
To keep current behavior.
Before this change, 1st argument of `on_vm_shutdown` is `exception_handler`. You can see it on this change. If `exception_handler` sets to `false`, emergency dump handles it as OOM:
static void post_events(bool exception_handler, Thread* thread) {
if (exception_handler) {
EventShutdown e;
e.set_reason("VM Error");
e.commit();
} else {
// OOM
LeakProfiler::emit_events(max_jlong, false, false);
}
EventDumpReason event;
event.set_reason(exception_handler ? "Crash" : "Out of Memory");
event.set_recordingId(-1);
event.commit();
}
I'm not sure this code would be called when OOM happens, but I think we need to keep this behavior in this change - this change focuses on working emergency dump with `CrashOnOutOfMemoryError`.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/26468#discussion_r2230449677
More information about the hotspot-jfr-dev
mailing list