jvm — jvm加载机制

概念

​ 类的class文件中包含了类的所有信息。

​ jvm将描述类的数据从class文件中加载到内存,并对数据进行校验,解析和初始化,生成可以被jvm直接使用的java类型

类加载时机

  1. 加载

  2. 链接(跟加载并行) 包括验证,准备,解析

  3. 初始化

  4. 使用

  5. 卸载

类加载过程-加载

  • 通过类的全限定名获取此类的二进制流

    加载源(文件 eg:class文件,jar文件;网络;计算生成 eg:动态代理生成接口的实例)

  • 将字节流中的静态数据结构转化成运行时方法区中的动态数据结构

  • 在内存中生成一个这个类的Class对象,作为这个类的各种数据的访问入口

类加载过程-验证

  • 保证class文件符合规范
  • 文件格式 cafebaby,版本号等
  • 元数据 语义校验,比如是否有父类,是否继承了final修饰的类等
  • 字节码校验
  • 符号引用校验

类加载过程-准备

  • 类变量赋初始值。 Int 0;double 0.0; 应用 null ; 在方法区中
  • 类常量赋指定值。

类加载过程-解析

  • 将常量池中的符号引用转为直接引用

类加载过程-初始化

触发初始化:

  • 遇到new,getstatic,putstatic (使用类的静态变量),invokestatic(调用类的静态方法)的字节码命令的时候,会初始化
  • 反射
  • 初始化子类之前一定会先初始化父类
  • 程序入口main的类

不会初始化: ( 211页 3段demo)

  • 通过子类引用父类的静态变量,子类不会被初始化 Child.filed 不会初始化Child,其中filed是父类的静态变量
  • 使用类的常量,不会初始化类(常量在编译的时候已经放入了方法区)
  • 数组引用类 Student[] stus=new Student[10]; 不会初始化Student类