有时候诊所首先被执行,有时候匿名类首先被加载的原因是什么?
类加载过程包含以下过程.
装载
链接
验证
制备
解析度
初始化
运用
卸下
现在我们关注加载的引用类的分辨率和初始化阶段发生在分辨率阶段,
为了提高性能,HotSpot VM通常会等到类初始化以加载和链接类.因此,如果类A引用类B,则加载类A不一定会导致加载类B(除非验证需要).执行引用B的第一条指令将导致B的初始化,这需要加载和链接B类.
有没有办法跟踪JVM何时调用类的临时?类似于-verbose:class或-XX:+ TraceClassLoading等?
我不知道是否存在一些jvm参数,你可以获得jvm直接调用
参考:
Java虚拟机内部的第7章
jvm_ti
HotSpot运行时概述
这里是那些不想阅读所有评论的人的解决方案摘要;)
执行顺序的差异是由其中一个已-noverify
指定的启动程序引起的.验证程序可能会导致加载其他类,如JVM规范中所述.无论是否加载类,似乎都取决于对象所分配的字段的类型.更多细节在这里.另一方面,当开始时-noverify
,没有验证,因此类的加载仅发生在代码中首次使用的位置,
在我的情况下.
有一些方法可以跟踪调用
而无需修改字节代码.一种方法是使用-XX:+TraceClassInitialization
on JDK8.但是,这需要JVM的调试版本(注意:这不是您的程序在调试模式下启动,但实际上是在启用调试的情况下编译的VM.可以在此处找到有关如何构建它的指南).另一种方式 - 只提供JDK9 - 是使用新的JEP 158:统一JVM日志记录功能,并在启动程序时提供类似以下内容:(
-Xlog:class+load=info,class+init=info:file=trace.log
请参阅此处了解如何获取完整的标记和参数列表)