jvm Java详细类装入

lbsnaicq  于 2023-05-17  发布在  Java
关注(0)|答案(3)|浏览(135)

我试图列出Java类装入器装入我的类的顺序。如果我使用-verbose参数,它将列出它加载每一个接口/类,包括大量的接口,如Serializable、exceptions等。有没有一种方法可以调整这个输出,使它只显示哪些类被加载到我的主方法被定义的类中?

k2fxgqgv

k2fxgqgv1#

我想你最好的选择是做以下事情:

  • main方法开始和结束之前输出一些固定的文本。
  • verbose 输出通过管道传输到文件中
  • 使用类似 lessgrep 的东西来查找从main方法加载到两个标记之间的类。

这里有一个类似的问题和一些答案:Is there a way to get which classes a ClassLoader has loaded?
你试过-verbose:class吗?

yyyllmsg

yyyllmsg2#

下面是一个sed表达式,它将解析java-verbose:class的输出,以生成加载的类名及其jar文件对。您可以进一步通过排序来获得唯一的jar文件。比如说

java -verbose:class -version 2>/dev/null |
  sed -ne 's/\[Loaded \(.\+\) from \(.\+\)\]/\2/p' | 
  sort -u

产出

/usr/local/jdk1.7.0_67/jre/lib/rt.jar
s6fujrry

s6fujrry3#

对于Java 9+,可以使用-Xlog:class+init。例如,当你启动JVM时,这个命令会打印出类的加载顺序:

java -Xlog:class+init -version

该命令将打印类似于

[0.018s][info][class,init] 0 Initializing 'java/lang/Object'(no method) (0x0000000800000e60)
[0.018s][info][class,init] 1 Initializing 'java/lang/CharSequence'(no method) (0x0000000800009210)
[0.018s][info][class,init] 2 Initializing 'java/lang/String' (0x00000008000089b8)
[0.018s][info][class,init] 3 Initializing 'java/util/Comparator'(no method) (0x00000008000eb588)
[0.018s][info][class,init] 4 Initializing 'java/lang/String$CaseInsensitiveComparator'(no method) (0x000000080010dff8)
[0.018s][info][class,init] 5 Initializing 'java/lang/System' (0x0000000800002b68)
[0.019s][info][class,init] 6 Initializing 'java/lang/reflect/AnnotatedElement'(no method) (0x0000000800013cd0)
[0.019s][info][class,init] 7 Initializing 'java/lang/reflect/Type'(no method) (0x0000000800015210)
[0.019s][info][class,init] 8 Initializing 'java/lang/Class' (0x00000008000139e0)

相关问题