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

David Holmes dholmes at openjdk.org
Thu Jul 13 21:15:28 UTC 2023


On Fri, 7 Jul 2023 18:01:14 GMT, Doug Simon <dnsimon at openjdk.org> wrote:

>> 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 adds support for `-Xlog:class+load+cause` and `-Xlog:class+load+cause+native` that produce output according to a new `LogClassLoadingCauseFor` VM flag:
>> 
>> 
>>   product(ccstr, LogClassLoadingCauseFor, nullptr,                          \
>>           "Apply -Xlog:class+load+cause* to classes whose fully "           \
>>           "qualified name contains this string ("*" matches "             \
>>           "any class).")                                                    \
>> 
>> 
>> Example usage:
>> 
>> java "-Xlog:class+load+cause*" -XX:LogClassLoadingCauseFor=java.util.concurrent.ConcurrentHashMap$V --version
>> [0.075s][info][class,load,cause] Java stack when loading java.util.concurrent.ConcurrentHashMap$ValuesView:
>> [0.075s][info][class,load,cause] 	at java.util.concurrent.ConcurrentHashMap.values(java.base/ConcurrentHashMap.java:1263)
>> [0.075s][info][class,load,cause] 	at jdk.internal.loader.NativeLibraries.find(java.base/NativeLibraries.java:102)
>> [0.075s][info][class,load,cause] 	at java.lang.ClassLoader.findNative(java.base/ClassLoader.java:2457)
>> [0.075s][info][class,load,cause] 	at sun.nio.fs.UnixNativeDispatcher.init(java.base/Native Method)
>> [0.075s][info][class,load,cause] 	at sun.nio.fs.UnixNativeDispatcher.<clinit>(java.base/UnixNativeDispatcher.java:817)
>> [0.075s][info][class,load,cause] 	at sun.nio.fs.UnixFileSystem.<init>(java.base/UnixFileSystem.java:96)
>> [0.075s][info][class,load,cause] 	at sun.nio.fs.BsdFileSystem.<init>(java.base/BsdFileSystem.java:50)
>> [0.075s][info][class,load,cause] 	at sun.nio.fs.MacOSXFileSystem.<init>(java.base/MacOSXFileSystem.java:52)
>> [0.075s][info][class,load,cause] 	at sun.nio.fs.MacOSXFileSystemProvider.newFileSystem(java.base/MacOSXFileSystemProvider.java:44)
>> [0.075s][info][class,load,cause] 	at sun.nio.fs.MacOSXFileSystemProvider.newFileSystem(java.base/MacOSXFileSystemProvider.java:37)
>> [0.075s][info][class,load,cause] 	at sun.nio.fs.UnixFileSystemProvider.<init>(java.base/UnixFileSystemProvider.java:78)
>> [0.075s][info][class,load,cau...
>
> Doug Simon has updated the pull request incrementally with one additional commit since the last revision:
> 
>   refactor body of print_class_load_logging in print_class_load_helper

src/hotspot/share/oops/instanceKlass.cpp line 3835:

> 3833:                         cfs->length(),
> 3834:                         ClassLoader::crc32(0, (const char*)cfs->buffer(),
> 3835:                         cfs->length()));

The indentation changes you made here (and elsewhere) are incorrect - the original was correct: arguments should line up

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

PR Review Comment: https://git.openjdk.org/jdk/pull/14553#discussion_r1263059028


More information about the hotspot-dev mailing list