乐趣区

关于java:类加载与Spring框架Lazy延迟加载

类加载

什么是类加载

类加载就是指 – 将类读入到了 JVM 的内存中, 就是类加载到了内存中, 能够进行应用.

class Point{}
public class TestClassLoader01 {public static void main(String[] args) {Point p1;}
}

那么下面这段代码中,”Point p1;“ 申明语句有将 Point 类加载到内存中吗? 通过什么形式能证实它被加载到内存中了呢?

如何验证?
能够基于 JVM 的参数配置:
在类中右键 ->Run As->Run Configurations->Arguments->VM arguments 中输出:-XX:+TraceClassLoading

运行后显示:

运行后会显示大段上图所示的显示语句, 均是运行程序时所加载的类, 能够利用快捷键 Ctrl+ F 来查找咱们所本人编写的 Point 类, 发现并没有被加载.

上述代码中, 仅仅是将 Point 类做了申明, 失去的后果是并没有被加载到内存中; 那么如果咱们理论 new 出对象呢?

将上述代码批改:

class Point{}
public class TestClassLoader01 {public static void main(String[] args) {Point p1 = new Point();
    }
}

再次运行后显示:

在控制台的运行后果的截取片段中, 咱们能够看到标红的框内能够看到曾经加载到了咱们所编写的 Point 类.

论断

依据上边简略的示例, 咱们能够失去论断:

只是援用类, 是不会加载到 JVM 内存中的;
须要创立真正的实例对象 (new/ 反射创建对象) 才会将类加载到 JVM 内存中.

@Lazy 的加载

之前的文章中也提到过 @Lazy 注解是 Spring 框架的一大劣势 – 提早加载, 能够让大对象 (占用内存较多) 应用时才创立, 得以无效的节俭内存资源.

那么, 该注解所谓的提早加载, 到底是将形容的类何时加载呢?

咱们能够依据上文中验证类加载的办法, 去验证 @Lazy 的提早加载, 能够在控制台看到, 加载信息中曾经存在 @Lazy 注解形容的类的加载信息了.

论断

所以咱们也就晓得,@Lazy 注解所谓的提早加载, 并不是说将类先不加载到 JVM 内存中, 而是先不创立实例对象.

从另一个方面来了解,@Lazy 都是形容 Spring 框架 Bean 池中的对象,Bean 池中的对象都是 Spring 框架曾经创立好的存储在 Bean 池中的, 所以会加载也是理所应当的.

退出移动版