美文网首页
虚拟机类加载机制

虚拟机类加载机制

作者: 蜡笔没了小新_e8c0 | 来源:发表于2019-05-22 20:32 被阅读0次

    概述

    虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。

    类加载的时机

    类的生命周期

    解析阶段不一定在初始化之前,可能在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定。

    类加载器

    自定义类加载器 —> 应用程序类加载器(Application ClassLoader) —> 扩展类加载器(Extension ClassLoader) —> 启动类加载器(Bootstrap ClassLoader)

    双亲委派模型的工作过程为:如果一个类加载器收到了类加载的请求,它首先不会自己尝试加载该类,而是把这个请求委派给父类加载器去完成,每个层次的类加载器哦都是如此,因此所有的加载请求最终都会被传送到启动类加载器中,只有当父类加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载。

    使用双亲委派模型可以保证一些相同名称的类在不同的类加载器环境中都是同一个类。

    验证

    • 文件格式验证:验证字节流是否符合Class文件格式的规范;例如:是否以魔术0xCAFEBABE开头、主次版本号是否在当前虚拟机的处理范围之内、常量池中的常量是否有不被支持的类型。
    • 元数据验证:对字节码描述的信息进行语义分析(注意:对比javac编译阶段的语义分析),以保证其描述的信息符合Java语言规范的要求;例如:这个类是否有父类,除了java.lang.Object之外。
    • 字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。
      符号引用验证:确保解析动作能正确执行。

    准备

    准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。

    解析

    阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用进行。

    相关文章

      网友评论

          本文标题:虚拟机类加载机制

          本文链接:https://www.haomeiwen.com/subject/kcbtwqtx.html