RFR: 8193513: add support for printing a stack trace on class loading [v3]

Doug Simon dnsimon at openjdk.org
Wed Jun 21 07:20:20 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)
> ...

Doug Simon has updated the pull request incrementally with one additional commit since the last revision:

  [skip ci] add checks when accessing current JavaThread

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/14553/files
  - new: https://git.openjdk.org/jdk/pull/14553/files/0de42ef9..535ba7ea

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=14553&range=02
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=14553&range=01-02

  Stats: 4 lines in 1 file changed: 3 ins; 0 del; 1 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