美文网首页
JVM(三)JVM的执行子系统

JVM(三)JVM的执行子系统

作者: 7ColorLotus | 来源:发表于2020-05-30 16:29 被阅读0次
    • Class文件结构

      1. java跨平台的基础

      2. Class类的本质
        1> Class文件是一组以8位字节为基础单位的二进制流
        2> 类似于结构体的伪结构来存储数据
        3> 只有两种数据类型:无符号数和表
        4> 无符号数属于基本的数据类型,以u1,u2,u4,u8
        5> 表是由多个无符号数或者其他表作为数据项构成的符合数据类型

      3. Class文件格式详解
        1> 魔数与Class文件版本

           a, java的Class文件魔数:CAFEBABE
           b, java版本号从45号开始
        

        2> 常量池

           a, 字面量:类似于我们常见的常量
           b, 符号引用:类和接口的全限定名,字段名称等等,方法的名称等等
        

        3> 访问标志
        4> 类索引、父类索引、与接口索引集合
        5> 字段表集合
        6> 方法表集合
        7> 属性表集合
        8> javap -verbose xxx.class 查看class文件内容


        class文件格式.png
    • 字节码指令

      1. 虚拟机所有的指令都是一个字节(0-255),特定的数字表示某种操作,指令数不超过256
      2. invoke开头的指令都是方法调用指令
      3. areturn 返回的是一个引用类型,byte,short,char,boolean,int都是i,long 是l
      4. 指令的分类
        1> 加载和存储指令
        2> 运算指令
        3> 类型转换指令
        4> 对象创建与访问指令
        5> 操作数栈管理指令
        6> 控制转移指令
    • 类加载机制

      1. 加载(Loading)
        1> 加载类的二进制流
        2> 把静态的存储结构转化为方法区的运行时结构
        3> 生成一个代表这个类的class对象
      2. 连接(Linking)
        1>验证(Verification) :检查二进制流是否符合虚拟机的格式
        2>准备(Preparation):内存分配
        3>解析(Resolution):
      3. 初始化(Initialization): 执行类的构造器。<clinit>不是必须的,而且同时只能有一个线程执行。有且只有5种情况
        1> new,getstatic,setstatic,invokestatic
        2> 对类进行反射调用
        3> 初始化一个类,但是父类还没有初始化的时候,先触发父类的初始化
        4> 指定一个执行main的类,应用程序的主类
        5> 动态语言支持
      4. 使用(Using)
      5. 卸载(Unloading)
    • 类加载器

      1. 用途:热加载器,代码保护和加密,类层次划分,OSGI等
      2. 自定义类加载器对类进行加密和解密
      3. 一个类是否唯一,由这个类本身和加载它的类加载器两个一起决定
      4. 系统的类加载器
        1> 启动类加载器(BootstrapClassLoader) 加载存放在JAVA_HOME\lib目录里的类库,并且是虚拟机识别的类库加载到虚拟机内存中
        2> 扩展类加载器(ExtensionClassLoader) 存放在JAVA_HOME\lib\ext目录中的所有类库,开发者可以直接使用
        3> 应用程序加载器(ApplicationClassLoader) 加载用户类路径上指定的类库,开发者可以直接使用,一般情况下这个就是程序中默认的类加载器
      5. 双亲委派模型
        1> 双亲委派模型过程:某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载
        2> 双亲委派模型好处:Java类随着它的类加载器一起具备了带有优先级的层次关系,保证java程序稳定运行
        3> 线程上下文加载器
      6. Tomcat类加载机制


        Tomcat类加载机制.png
    • 栈帧

      1. 局部变量表:每个局部变量都有一个槽,这个槽可以重用
      2. 操作栈
      3. 动态连接
      4. 返回地址
    • 方法调用详解

      1. 解析:类的静态方法,构造方法,私有方法等在编译期就可以确定
      2. 分派
        1> 静态分派:方法的重载,编译器确定了调用的方法是哪一个
        2> 动态分派:类的重写,虚方法表(虚拟机维护,维护着各个方法的实际入口<方法区中的某个地址>,一个类一个方法表)
        3> 动态分派的实现
    • 基于栈的字节码解释执行引擎
      1)基于栈的指令集与基于寄存器的指令集
      1> 基于栈的指令集可移植
      2> 基于寄存器的指令集,和硬件关系比较紧密,速度快

    • 尝试跟着字节码解析代码

    相关文章

      网友评论

          本文标题:JVM(三)JVM的执行子系统

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