类加载

什么是类加载

类加载就是指--将类读入到了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池中的,所以会加载也是理所应当的.