类的生命周期一般要经历一下几个过程:加载->验证->准备->解析->初始化->使用->卸载。
这几个步骤正常情况下都会按部就班地开始(除了[解析]这个阶段,可能会发送在初始化之后)。具体可以参考周志明大大的那本书《深入理解Java虚拟机:JVM高级特性与最佳实践》
正常情况下,对一个类进行主动(总共5中情况,请参考书籍)使用的时候,一定会导致类的初始化,且是”有且只有“
那是不是就可以认为类的加载和类的初始化是同时发生的呢?
那本书里面只是简单提了一下:类的加载时机在JVM规范中并没有作严格的规定,具体是交给JVM虚拟机自己去实现的。
那到底什么时候一个类只会被加载但是没有初始化呢?
在校验类的时候,如果发生了类型转换的话,则会导致类的提前加载。
本demo中涉及的JVM参数
- 关闭类的校验: -Xverify:none 或者 -noverify
- 追踪类的加载: -verbose:class 或者 -XX:+TraceClassLoading
本demo中引入的fastjson的scope是provided。这意味着本demo可以正常编译,但是在运行期实际是加载不到fastjson的所有类的。