RFC: call report_java_out_of_memory_error() for -XX:AbortVMOnException=java.lang.OutOfMemoryError

Liu, Xin xxinliu at amazon.com
Fri Aug 27 18:54:30 UTC 2021


Hi,

Recently I revisit JDK-8155004/JDK-8257790 because a new team trip over.
-XX:AbortVMOnException=java.lang.OutOfMemoryError works. I wonder
whether it is a good idea to call report_java_out_of_memory_error() when
OOME is trapped. In this way, HotSpot will trigger OnOutOfMemoryError
callbacks.

I understand JDK-8257790 is not a bug. I don't want to overthrow that
conclusion. I just wonder if we can handle it better in the presence of
-XX:AbortVMOnException=java.lang.OutOfMemoryError.

For Java webservers, OOME may lead to a zombie process. We may have a
bug in code or indeed run out of memory. OOME is suppressed or terminate
the thread but don't terminate the java process. eg.

public class Main {
    volatile static boolean done = false;

    public static void main(String[] args) {
        String msg = "a long long message.";
        // write your code here
        Runnable runnable = () -> {
            int cnt = Integer.MAX_VALUE / msg.length() + 1;
            //it will throw a OutOfMemoryError.
            msg.repeat(cnt);
            done = true;
        };

        Thread thread = new Thread(runnable);
        thread.start();
        while(!done) {
        } // this simulates the main loop of event handling
    }
}

Java developers can use
-XX:AbortVMOnException=java.lang.OutOfMemoryError to exercise fail-fast
principle. Java web application which handle traffics are usually
distributed in a cluster. A failure of a single host usually is not a
big deal. As long as java exits, it's easy to restart and backfill it.

My proposing change is very simple. Just call
report_java_out_of_memory() if value_string is OOME. It's no-op if users
never specify anything. If they do specify flags like
Crash/ExitOnOutOfMemory,  OnOutOfMemoryError or
HeapDumpOnOutOfMemoryError, HotSpot will let report_java_out_of_memory
does the cleanup job. fatal() works but too brutal. I think we should
let java exits with error code.


diff --git a/src/hotspot/share/utilities/exceptions.cpp
b/src/hotspot/share/utilities/exceptions.cpp
index bd95b8306be..fd8a83deaf3 100644
--- a/src/hotspot/share/utilities/exceptions.cpp
+++ b/src/hotspot/share/utilities/exceptions.cpp
@@ -538,6 +538,9 @@ void Exceptions::debug_check_abort(const char
*value_string, const char* message
       strstr(value_string, AbortVMOnException)) {
     if (AbortVMOnExceptionMessage == NULL || (message != NULL &&
         strstr(message, AbortVMOnExceptionMessage))) {
+      if(!strcmp(value_string, "java.lang.OutOfMemoryError")) {
+        report_java_out_of_memory(message);
+      }
       fatal("Saw %s, aborting", value_string);
     }
   }


thanks,
--lx



More information about the hotspot-runtime-dev mailing list