可能有时有想,项目开发过程中经常会用到各种第三方库,包括各种框架、工具类、sdk等等,那么这些第三方的类难道都等到项目启动的时候,把这些类统统都加载到JVM内存中嘛,这不得把JVM给“挤爆了”,所以,为了解决这个困境,就引出了一个“懒加载”的概念
那么如何证明是 JVM 是懒加载模式呢
1、先看下面一段代码
public class ClassLoaderController {
static {
System.out.println("********** loading ClassLoaderController class **********");
}
public static void main(String[] args) {
new DemoA();
System.out.println("*************** loading test ************");
DemoB demoB = null;
}
}
class DemoA {
static {
System.out.println("********** loading DemoA class **********");
}
public DemoA() {
System.out.println("********** init DemoA **********");
}
}
class DemoB {
static {
System.out.println("********** loading DemoB class **********");
}
public DemoB() {
System.out.println("********** init DemoB **********");
}
}
2、简单分析一下执行顺序
- 第一步:运行main方法,运行main()方法首先肯定会加载ClassLoaderController这个类,类加载的最后一步是初始化,其中就会有执行静态代码块这一步骤,所以首先会输出
********** loading ClassLoaderController class **********
- 第二步:在main方法中,会去
new DemoA()
,这一步,也代表了会去用DemoA()
这个类,那毫无疑问,肯定会去加载DemoA()
这么一个类,那么在加载DemoA()
类的过程中,同样最后一步初始化中会去执行静态代码快,输出********** loading DemoA class **********
,接着再执行构造方法,输出********** init DemoA **********
- 第三步:为了方便观察打印结果,我们直接输出
*************** loading test ************
- 第四步:我们定义了
DemoB
类,但是我们给它赋值的是空值,也就是说,我们是没用到DemoB
类的,所以自然也不会打印********** loading DemoB class **********
和********** init DemoB **********
3、综合分析,打印结果为
********** loading ClassLoaderController class **********
********** loading DemoA class **********
********** init DemoA **********
*************** loading test ************
符合我们的预期,也证明了,JVM的类加载是一个懒加载
本文只是简单验证了一下,希望对你有所帮助