RFR: 8193513: add support for printing a stack trace on class loading
Doug Simon
dnsimon at openjdk.org
Tue Jun 20 09:26:07 UTC 2023
In the development of libgraal, it has been very useful to see why a given class is loaded (e.g., trying to reduce startup time by avoiding unnecessary eager class loading). One way to do this is to see the stack trace when the VM loads a class. The only possibility currently is to add a static initializer to the class of interest. However, not only is this not always possible but it doesn't correlate with class loading but with class initialization.
This PR proposes a `TraceClassLoadingCause` VM flag:
product(ccstr, TraceClassLoadingCause, nullptr, DIAGNOSTIC, \
"Print a stack trace when loading a class whose fully" \
"qualified name contains this string ("*" matches " \
"any class).") \
I would have liked to implement this using Unified Logging but UL has no support for filtering on the class names.
Example usage:
java -XX:+UnlockDiagnosticVMOptions -XX:TraceClassLoadingCause=Thread --version
Loading java.lang.Thread
Loading java.lang.Thread$FieldHolder
Loading java.lang.Thread$Constants
Loading java.lang.Thread$UncaughtExceptionHandler
Loading java.lang.ThreadGroup
Loading java.lang.BaseVirtualThread
Loading java.lang.VirtualThread
Loading java.lang.ThreadBuilders$BoundVirtualThread
Loading java.lang.Thread$State
at jdk.internal.misc.VM.toThreadState(java.base/VM.java:336)
at java.lang.Thread.threadState(java.base/Thread.java:2731)
at java.lang.Thread.isTerminated(java.base/Thread.java:2738)
at java.lang.Thread.getThreadGroup(java.base/Thread.java:1957)
at java.lang.ref.Reference$1.startThreads(java.base/Reference.java:314)
at java.lang.System.initPhase1(java.base/System.java:2206)
Loading java.lang.Thread$ThreadIdentifiers
at java.lang.Thread.<init>(java.base/Thread.java:734)
at java.lang.Thread.<init>(java.base/Thread.java:1477)
at java.lang.ref.Reference$ReferenceHandler.<init>(java.base/Reference.java:198)
at java.lang.ref.Reference.startReferenceHandlerThread(java.base/Reference.java:300)
at java.lang.ref.Reference$1.startThreads(java.base/Reference.java:318)
at java.lang.System.initPhase1(java.base/System.java:2206)
Loading java.lang.ref.Finalizer$FinalizerThread
at java.lang.ref.Finalizer.startFinalizerThread(java.base/Finalizer.java:187)
at java.lang.ref.Reference$1.startThreads(java.base/Reference.java:319)
at java.lang.System.initPhase1(java.base/System.java:2206)
...
-------------
Commit messages:
- added TraceClassLoadingCause flag
Changes: https://git.openjdk.org/jdk/pull/14553/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=14553&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8193513
Stats: 18 lines in 2 files changed: 18 ins; 0 del; 0 mod
Patch: https://git.openjdk.org/jdk/pull/14553.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/14553/head:pull/14553
PR: https://git.openjdk.org/jdk/pull/14553
More information about the hotspot-dev
mailing list