Java类加载机制

  加载阶段是类加载过程的第一阶段。在此阶段,JVM的主要目的是将字节码从各个位置(网络、磁盘等)转换为二进制字节流到内存中,然后在JVM的方法区域中为此类创建相应的Class对象。此Class对象是此类的各种数据的访问点。
  当JVM加载Class字节码文件并在方法区域中创建相应的Class对象时,JVM启动字节码流的验证,并且只有符合JVM字节码规范的文件才能由JVM正确执行。此验证过程大致可分为以下几种类型:
  JVM规范验证。 JVM对字节流执行文件格式检查,以确定它是否符合JVM规范,并且可以由当前版本的虚拟机进行处理。例如:文件是否以0x cafe bene开头,主版本号和辅助版本号是否在当前虚拟机处理范围内,依此类推。
  代码逻辑检查。 JVM验证组成代码的数据流和控制流,确保JVM在运行字节码文件后不会出现致命错误。例如,方法需要传递int类型的参数,但是在使用它时,它会传递String类型的参数。方法需要返回String类型的结果,但最终它不返回结果。该代码引用了一个名为Apple的类,但您实际上并未定义Apple类。
  当代码数据加载到内存中时,虚拟机会验证代码数据,以查看代码是否实际是根据JVM规范编写的。此过程与我们对问题的答案没有直接关系,但了解类加载机制必须了解此过程。
  准备(重点)
  验证字节码文件后,JVM开始为类变量分配内存并初始化它。这里有两个要点需要注意,即内存分配的对象和初始化的类型。
  内存分配的对象。 Java中的变量有两种类型:“类变量”和“类成员变量”。 “类变量”是指由static修改的变量,而所有其他类型的变量都属于“类成员变量”。在准备阶段,JVM仅为“类变量”分配内存,而不为“类成员变量”分配内存。 “类成员变量”的内存分配需要等到初始化阶段。
  例如,在准备阶段,以下代码仅为因子属性分配内存,而不为网站属性分配内存。Public static int factor = 3;
  Public String website =" www.baidu.com";
  初始化的类型。在准备阶段,JVM为类变量分配内存并初始化它们。但这里的初始化是指在Java语言中为该数据类型分配变量零值,而不是在用户代码中初始化的值。
  例如,在以下代码处于准备阶段后,扇区的值将为0而不是3。
  public static int sector = 3;
  但是如果变量是常量(由静态最终修改),那么在准备阶段,属性将被赋予用户想要的值。例如,在以下代码处于准备阶段后,number的值将为3而不是0。
  Public static final int number = 3;
  直接复制静态final,静态变量的值为零。事实上,我们可以稍加思考一下。
  两个语句之间的区别在于,一个具有final关键字修饰符而另一个没有。 final关键字表示Java中的不可变含义,这意味着数字值在分配后不会更改。由于一旦完成赋值,它就不会改变,所以你必须在开头给它你想要的值,所以最后修改的类变量将在准备阶段给出所需的值。未完成的类变量可能在初始化阶段或运行阶段期间发生变化,因此无需在准备阶段为其提供用户想要的值。
  分析
  通过准备阶段时,JVM用于类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7用于解析的类引用。此阶段的主要任务是将常量池中的符号引用替换为其在内存中的直接引用。
  事实上,这个阶段对我们来说几乎是透明的。看看吧。
  初始化(重点)
  到初始化时,用户定义的Java代码实际上将开始执行。在此阶段,JVM根据语句的执行顺序初始化类对象。通常,JVM在遇到以下五个条件时会触发初始化:遇到新的、 getstatic、 putstatic、 invokestatic这四个字节码指令,如果类尚未初始化,则需要触发其初始化。用于生成这四条指令的最常见Java代码方案是:当使用new关键字实例化对象时,、读取或设置类的静态字段(由、最终确定已经在编译器中放入常量池静态)该字段被排除,以及调用类的静态方法时。
  当您使用java.lang.reflect包方法对类进行反射调用时,如果该类尚未初始化,则需要触发其初始化。
  初始化类时,如果发现其父类尚未初始化,则需要触发其父类的初始化。
  启动虚拟机时,用户需要指定要执行的主类(包含main()方法的类),虚拟机首先初始化主类。
  当使用JDK1.7动态语言支持时,如果java.lang.invoke.MethodHandle实例的最终解析结果是REF_getstatic,REF_putstatic,REF_invokeStatic的方法句柄,并且该方法句柄对应的类未初始化,则需要触发第一。它的初始化。
  当你看到上述情况时,你可能会头晕,但没关系,你不需要回来,只要知道它,你就可以回去找到它。
  使用
  当JVM完成初始化阶段时,JVM开始从entry方法执行用户的程序代码。这个阶段只是为了理解它。
  卸载
  执行用户程序代码时,JVM开始销毁创建的Class对象,负责运行的JVM也会退出内存。这个阶段只是为了理解它。

此文章为 驿长(入驻一点号的媒体名称)原创,特此声明!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值