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

David Holmes david.holmes at oracle.com
Tue Aug 31 04:26:26 UTC 2021


Hi,

On 28/08/2021 4:54 am, Liu, Xin wrote:
> 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.

Why not just use AbortVMOnException together with OnError to get the 
callbacks?

Cheers,
David

> 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