关于JVM加载机制的几点说明

时间:2022-02-08 05:30:02
(一)预先加载与依需求加载

1、预先加载


Java 运行环境为了优化系统,提高程序的执行速度,在 JRE 运行的开始会将 Java 运行所需要的基本类采用预先加载( pre-loading )的方法全部加载要内存当中,因为这些单元在 Java 程序运行的过程当中经常要使用的,主要包括 JRE 的 rt.jar 文件里面所有的 .class 文件。

2、依需求加载

相对于预先加载,我们在程序中需要使用自己定义的类的时候就要使用依需求加载方法( load-on-demand ),就是在 Java 程序需要用到的时候再加载,以减少内存的消耗。
那么JRE 的依需求加载究竟是在什么时候把类加载进入内部的呢?
  a、我们在定义一个类实例的时候,比如 TestClassA testClassA ,这个时候 testClassA 的值为 null ,也就是说还没有初始化,没有调用 TestClassA 的构造函数,只有当执行 testClassA = new TestClassA() 以后, JRE 才正真把TestClassA 加载进来
  b、通过java的反射机制我们也可以显式加载某一个类,比如:Class user=Class.forName("com.User");

(二) 隐式加载和显示加载

1.隐式加载


所谓隐式加载就是我们在程序中用 new 关键字来定义一个实例变量, JRE 在执行到 new 关键字的时候就会把对应的实例类加载进入内存。隐式加载的方法很常见,用的也很多, JRE 系统在后台自动的帮助用户加载,减少了用户的工作量,也增加了系统的安全性和程序的可读性。

2.显式加载

所谓显示加载就是有程序员自己写程序把需要的类加载到内存当中,最常见的就是使用java的反射机制进行加载,如:Class user=Class.forName("com.User");

(三)加载与初始化

在Java中,类装载器把一个类加载入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化;
   1、 装载:查找和导入类或接口的二进制数据;
   2、 链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
            a、校验:检查导入类或接口的二进制数据的正确性;
            b、准备:给类的静态变量分配并初始化存储空间;
            c、 解析:将符号引用转成直接引用;
   3、 初始化:激活类的静态变量,初始化Java代码和静态Java代码块

值得注意的是:加载器在加载类的时候可以选择要不要初始化,而一般通过new的方式进行加载的时候都会触发初始化过程。