RFR: 8359870: JVM crashes in AccessInternal::PostRuntimeDispatch

Kevin Walls kevinw at openjdk.org
Wed Jun 25 10:21:27 UTC 2025


On Wed, 25 Jun 2025 10:15:54 GMT, Alan Bateman <alanb at openjdk.org> wrote:

>> ThreadDumper/ThreadSnapshot need to handle a failure to resolve the native VM JavaThread from a java.lang.Thread.  This is hard to reproduce but a thread that has since terminated can provoke a crash.  Recognise this and return a null ThreadSnapshot.
>
> src/java.base/share/classes/jdk/internal/vm/ThreadDumper.java line 184:
> 
>> 182:         if (snapshot == null) {
>> 183:             return; // Terminated
>> 184:         }
> 
> Would it be possible to use this instance, otherwise the thread counts will be confusing.
> 
> 
> --- a/src/java.base/share/classes/jdk/internal/vm/ThreadDumper.java
> +++ b/src/java.base/share/classes/jdk/internal/vm/ThreadDumper.java
> @@ -178,8 +178,11 @@ private static void dumpThreads(ThreadContainer container, TextWriter writer) {
>      }
>  
>      private static void dumpThread(Thread thread, TextWriter writer) {
> -        ThreadSnapshot snapshot = ThreadSnapshot.of(thread);
>          Instant now = Instant.now();
> +        ThreadSnapshot snapshot = ThreadSnapshot.of(thread);
> +        if (snapshot == null) {
> +            return;  // thread terminated
> +        }
>          Thread.State state = snapshot.threadState();
>          writer.println("#" + thread.threadId() + " "" + snapshot.threadName()
>                  + "" " + (thread.isVirtual() ? "virtual " : "") + state + " " + now);
> @@ -284,8 +287,9 @@ private static void dumpThreads(ThreadContainer container, JsonWriter jsonWriter
>          Iterator<Thread> threads = container.threads().iterator();
>          while (threads.hasNext()) {
>              Thread thread = threads.next();
> -            dumpThread(thread, jsonWriter);
> -            threadCount++;
> +            if (dumpThread(thread, jsonWriter)) {
> +                threadCount++;
> +            }
>          }
>          jsonWriter.endArray(); // threads
>  
> @@ -305,9 +309,12 @@ private static void dumpThreads(ThreadContainer container, JsonWriter jsonWriter
>       * Write a thread to the given JSON writer.
>       * @throws UncheckedIOException if an I/O error occurs
>       */
> -    private static void dumpThread(Thread thread, JsonWriter jsonWriter) {
> +    private static boolean dumpThread(Thread thread, JsonWriter jsonWriter) {
>          Instant now = Instant.now();
>          ThreadSnapshot snapshot = ThreadSnapshot.of(thread);
> +        if (snapshot == null) {
> +            return false;  // thread terminated
> +        }
>          Thread.State state = snapshot.threadState();
>          StackTraceElement[] stackTrace = snapshot.stackTrace();
>  
> @@ -369,6 +376,7 @@ private static void dumpThread(Thread thread, JsonWriter jsonWriter) {
>          }
>  
>          jsonWriter.endObject();
> +        return true;
>      }

Yes, will do that to fix the threadCount...

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/25958#discussion_r2166363495


More information about the serviceability-dev mailing list