一.前文提要
经过前文我们的代码到底是怎么运行起来的
我们已经了解到代码是如何加载到jvm里面并运行起来。
那么问题来了,jvm什么时候会加载我们的代码呢?
一个类从加载到使用,大约经过以下几个流程
编译-》加载-》验证-》准备-》解析-》初始化
-》使用-》卸载
其中标红部分是面试jvm相关必问的问题
二.JVM如何加载class文件?
上面的第一个问题,什么时候加载我们的代码?
当然是使用到的时候了,上文已经提到你的入口是main方法,那么加载这个main方法里面有哪些对象需要实例化的就加载哪些;如果听着有点绕,我们看下面的图片来一步一步解析。
这是一个kafka的类,里面有个main方法
那么这个kafka类是不是就首先加载到jvm里面
这时候我们对代码进行了增加了
ReplicaManager类由于是main方法的局部变量也需要加载到jvm里面;通过类加载器加载ReplicaManager.class文件到jvm里面。
图就变成这个样子了
三.加载之后做了啥?
验证阶段:主要验证class文件内容,是否符合jvm的规范?是否被篡改?
准备阶段:给类分配一个空间,并对静态变量(static)进行初始化
解析阶段:将符号引用转换成直接引用
初始化阶段:初始化可以理解为new了一个实例,但实际这是发生在实例化之前(初始化的时候如果发现父类没有,先初始化父类)
如图所示