RFR: 8359870: JVM crashes in AccessInternal::PostRuntimeDispatch [v7]
David Holmes
dholmes at openjdk.org
Tue Jul 1 03:08:42 UTC 2025
On Mon, 30 Jun 2025 11:24:28 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.
>
> Kevin Walls has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains 13 additional commits since the last revision:
>
> - remove test definition changes
> - TLH: use cv_internal_thread_to_JavaThread()
> - Merge remote-tracking branch 'upstream/master' into 8359870_threadexited
> - Test requires: permit linux debug testing
> - comment update
> - comment update
> - newline
> - Test fails on minimal VM: require jvmti feature
> - Correct THROW macro
> - ThreadDumper thread count
> - ... and 3 more: https://git.openjdk.org/jdk/compare/393efb22...e2043438
Some minor nits/suggestions but generally looks good.
src/hotspot/share/services/threadService.cpp line 1445:
> 1443: JavaThread* java_thread = nullptr;
> 1444: oop thread_oop;
> 1445: bool has_javathread = tlh.cv_internal_thread_to_JavaThread(jthread, &java_thread, &thread_oop);
Suggestion:
bool has_javathread = tlh.cv_internal_thread_to_JavaThread(jthread, &java_thread, &thread_oop);
assert((has_javathread && thread_oop != nullptr) || !has_javathread, "Missing Thread oop");
src/hotspot/share/services/threadService.cpp line 1447:
> 1445: bool has_javathread = tlh.cv_internal_thread_to_JavaThread(jthread, &java_thread, &thread_oop);
> 1446: Handle thread_h(THREAD, thread_oop);
> 1447: bool is_virtual = java_lang_VirtualThread::is_instance(thread_h());
Suggestion:
bool is_virtual = java_lang_VirtualThread::is_instance(thread_h()); // Deals with null
Just to make it clear we don't need an external null check here.
src/hotspot/share/services/threadService.cpp line 1450:
> 1448:
> 1449: if (!has_javathread && !is_virtual) {
> 1450: return nullptr; // thread terminated
Suggestion:
return nullptr; // thread terminated so not of interest
It took me a lot of backtracking in the Java code to find ThreadContainer which finally stated that only live threads are of interest, so an expanded comment here would help me. ( I was ready to suggest we should be creating a `ThreadSnapshot` that represents the terminated thread.)
src/java.base/share/classes/jdk/internal/vm/ThreadDumper.java line 313:
> 311: * @throws UncheckedIOException if an I/O error occurs
> 312: */
> 313: private static boolean dumpThread(Thread thread, JsonWriter jsonWriter) {
Please document the return value in the javadoc comment.
src/java.base/share/classes/jdk/internal/vm/ThreadSnapshot.java line 56:
> 54: * Take a snapshot of a Thread to get all information about the thread.
> 55: * Return null if a ThreadSnapshot cannot be created, for example if the
> 56: * thread has terminated.
Strictly speaking we can create a snapshot for a terminated thread, but our only client doesn't care about them so we don't.
-------------
Marked as reviewed by dholmes (Reviewer).
PR Review: https://git.openjdk.org/jdk/pull/25958#pullrequestreview-2973312048
PR Review Comment: https://git.openjdk.org/jdk/pull/25958#discussion_r2176304440
PR Review Comment: https://git.openjdk.org/jdk/pull/25958#discussion_r2176303308
PR Review Comment: https://git.openjdk.org/jdk/pull/25958#discussion_r2176318110
PR Review Comment: https://git.openjdk.org/jdk/pull/25958#discussion_r2176319448
PR Review Comment: https://git.openjdk.org/jdk/pull/25958#discussion_r2176320553
More information about the serviceability-dev
mailing list