3. 类加载器深入解析与阶段分解

目录

类加载

类加载器深入剖析

类的加载、连接与初始化

类的使用与卸载


类加载

  • 在Java代码中,类型(class)的加载、连接与初始化过程都是在程序运行期间完成的(动态代理)
    • 很多语言的加载和连接是在编译期间完成的,而java是在运行期间完成的,这给有创意的开发人员带来了很多拓展的可能性
    • 加载、连接和初始化的次序并不严格,看jvm厂商的实现
    • 加载,把磁盘上的class文件加载到内存当中
    • 连接,将类与类之间的调用关系给确定好 ,并且对于字节码的相关的处理(验证、校验)都在此阶段完成
    • 初始化,类型里面的静态变量的赋值
  • 提供了更大的灵活性,增加了更多的可能性

类加载器深入剖析

  • Java虚拟机与程序的生命周期
  • 在如下几种情况下,Java虚拟机将结束生命周期
    • 执行了System.exit()方法
    • 程序正常执行结束
    • 程序在执行过程中遇到了异常或错误而异常终止(异常抛到了main方法)
    • 由于操作系统出现错误而导致Java虚拟机进程终止

类的加载、连接与初始化

  • 加载:查找并加载类的二进制数据
  • 连接
    • 验证:确保被加载的类的正确性
    • 准备:为类的静态变量分配内存,并将其初始化为默认值
      • 尽管定义值public static int num = 1,但是在准备阶段并不会把1赋值给num变量,而是初始化为0,因为整型变量的默认值为0。所以即使定义public static int num;也会被赋予0
    • 解析:把类中的符号引用转换为直接引用
      • 符号引用:间接的引用,通过一个符号的表示来去表示一个类里面的方法引用了另外一个类。在Java中,一个java类将会编译成一个class文件。在编译时,java类并不知道所引用的类的实际地址,因此只能使用符号引用来代替。
      • 直接引用:直接把方法通过指针的方式指向我们所用的目标对象的内存的位置,这样就一下能找到特定的方法
  • 初始化:为类的静态变量赋予正确的初始值
    • 此时public final int num = 1定义的num才被赋予1

类的使用与卸载

  • 使用
  • 卸载
    • class加载后驻留在内存中,还可以被销毁。一旦卸载后就不能创建该类的对象

参考:

java -- JVM的符号引用和直接引用

猜你喜欢

转载自blog.csdn.net/Cheng_Kohui/article/details/93143021