JVM加载类 - 懒加载模式

可能有时有想,项目开发过程中经常会用到各种第三方库,包括各种框架、工具类、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的类加载是一个懒加载
本文只是简单验证了一下,希望对你有所帮助

你可能感兴趣的:(JVM加载类 - 懒加载模式)