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 serviceability-dev
mailing list