RFR: 8359870: JVM crashes in AccessInternal::PostRuntimeDispatch

Alan Bateman alanb at openjdk.org
Wed Jun 25 10:18:27 UTC 2025


On Tue, 24 Jun 2025 17:00:19 GMT, Kevin Walls <kevinw 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;
     }

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

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


More information about the hotspot-dev mailing list