class类文件结构

数据及结构

  • 是一组以8位字节为基础单位的二进制流。当遇到占有8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储
  • 采用一种类似于C语言结构体的伪结构来存储数据
    • 无符号数:u1 u2 u4 u8
    • 表: 由多个无符号数或者其他表作为数据项构成的复合数据类型

文件格式

类型 名称 数量 说明
u4 magic 1 魔数(0xCAFEBABY)-- 确定这个class文件是否能被虚拟机接受
u2 minor_version 1 次版本号
u2 major_version 1 主版本号
u2 constant_pool_count 1 常量池容量计数值
cp_info constant_pool constant_pool_count-1 常量池中每一项常量都是一个表(14种,jdk 1.7)
字面量 – 文本字符串、声明为final的常量值
符号引用 – 类和接口的全限定名、字段的名称和描述符、方法的名称和描述符
u2 access_flags 1 一共有16个标志位可以使用(当前之定义8个)
识别一些类或者接口层次的访问信息
ACC_PUBLIC、ACC_SUPER、ACC_FINAL、ACC_INTERFACE、ACC_ABSTRACT、ACC_SYNTHETIC、ACC_ANNOTATION、ACC_ENUM
u2 this_class 1
u2 super_class 1
u2 interfaces_count 1
u2 interfaces interfaces_count
u2 fields_count 1
field_info fields fields_count 包含类级变量和实例级变量(不包含局部变量)
字段表结构:access_flags(u2)、name_index(u2)、descriptor_index(u2)、attributes_count(u2)、attributes(attribute_info)
字段表集合中不会列出从超类或父接口中继承来的字段,但可能列出原本不存在的字段(譬如内部类为了保持对外部类的访问性,会自动添加指向外部类实例的字段)
u2 methods_count 1
method_info methods methods_count 方法表结构同字段表一样
方法表中的代码经过编译器编译成字节码指令后,存放在方法属性表中的“Code”属性里
如果父类方法在子类中没有被重写,方法表集合中就不会出现来自父类的方法信息,但同样有可能会出现编译器自动添加的方法,如类构造器"clinit"和实例构造器"init"
u2 attributes_count 1
attribute_info attributes attributes_count 如Code、ConstantValue、InnerClasses等等

字节码指令简介

加载和存储指令 – 将数据在栈帧中的局部变量表和操作数栈之间来回传输

* 将一个局部变量表加载到操作数栈:iload、iload_n、lload、fload、dload、aload(对象)、...
* 讲一个数值从操作数栈存储到局部变量表:i(l/f/d/a)store、i(l/f/d/a)store_n
* 将一个常量加载到操作数栈:bipush、sipush、ldc、ldc_w、ldc2_w、aconst_null、iconst_ml、iconst_i、lconst_l、fconst_f、dconst_d
* 扩充局部变量表的访问索引指令:wide

运算指令

*  加法指令:i(l/f/d)add
*  减法指令:i(l/f/d)sub
*  乘法指令:i(l/f/d)mul
*  除法指令:i(l/f/d)div
*  求余指令:i(l/f/d)rem
*  取反指令:i(l/f/d)neg
*  位移指令:ishl、ishr、iushr、lshl、lshr、lushr
* 按位或指令:ior 、lor
* 按位与指令:iand、land
* 按位异或指令:ixor、lxor
* 局部变量自增指令:iinc
* 比较指令:dcmpg、dcmpl、fcmpg、fcmpl、lcmp
  • 补充说明:

    • java 虚拟机规范没有明确定义过整型数据溢出的具体运算结果,除非求余及除法指令时除数为0抛出异常(ArithmeticException),其余任何整数运算场景都不抛出运行时异常
    • 浮点数转为整数时,所有小数部分有效字节会被丢弃 – 向零舍入模式
    • java虚拟机在处理浮点数运算时不会抛出任何运行时异常,当一个操作溢出时,将会使用有符号的无穷大来表示,如果某个操作没有明确的数学定义的话,将会使用NaN来表示。所有使用Nan值作为操作数的算术操作,结果都返回NaN。
         System.out.println(-9.11 > 1.11);            falseSystem.out.println((int)-9.11);                -9System.out.println((int)9.11);                9System.out.println(Double.NaN +1);            NaNSystem.out.println(Double.NaN *2);           NaNSystem.out.println(Double.NaN /2);           NaNSystem.out.println(Double.NaN < 1);       false

类型转换指令

对象创建与访问指令

  • 创建类实例指令: new
  • 创建数组指令: newarray、anewarray、multianewarray
  • 访问类字段(static字段,或者称为类变量)和实例字段(非static字段,或者称为实例变量)的指令:getstatic、putstatic、getfield、putfield
  • 把一个数组元素加载到操作数栈的指令:ba(ca/sa/ia/fa/da/aa)load
  • 取数组长度的指令: arraylength
  • 检查类实例类型的指令: instanceof、checkcast

操作数栈管理指令

  • 将操作数栈的栈顶一个或两个元素出站:pop、pop2
  • 复制栈顶一个或两个数值并将复制值或双份的复制值重新压入栈顶:dup、dup2、dup_x1、dup_x2、dup2_x1、dup2_x2
  • 将栈最顶端两个数值互换:swap

控制转移指令

  • 条件分支:ifeq、iflt、ifle、ifne、ifgt、ifge、ifnull、ifnonnull、if_icmpeq、if_icmpne、if_icmplt、…
  • 复合分支:tableswitch、lookupswitch
  • 无条件分支:goto、goto_w、jsr、jsr_w、ret

方法调用和返回指令

  • invokevirtual 用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派)
  • invokeinterface 调用接口方法,它会在运行时搜索一个实现了这个接口方法的对象,找到适合的方法进行调用
  • invokespecial 用于调用一些需要特殊处理的实例方法,包括实例初始化方法、私有方法和父类方法
  • invokestatic 用于调用类方法(static方法)
  • invokedynamic 用于在运行时动态解析出调用点限定符所引用的方法,并执行该方法
  • 返回指令:ireturn(当返回值是boolean、byte、char、short、int类型时使用)、lreturn、freturn、dreturn和areturn、return(声明为void的方法、实例初始化方法以及类和接口的类初始化方法使用)

异常处理指令

java程序中显式抛出异常的操作(throw语句)都是由athrow指令来实现,除了用throw语句显式抛出异常情况之外,java虚拟机规范还规定了许多运行时异常会在其它java虚拟机指令检测到异常时自动抛出。
在Java虚拟机中,处理异常(catch语句)是采用异常表来完成的。

jvm学习笔记-chapter6 类文件结构相关推荐

  1. JVM学习笔记(Ⅰ):Class类文件结构解析(带你读懂Java字节码,这一篇就够了)

    JVM学习笔记(Ⅰ):Class类文件结构解析,带你读懂Java字节码 前言:本文属于博主个人的学习笔记,博主也是小白.如果有不对的地方希望各位帮忙指出.本文主要还是我的学习总结,因为网上的一些知识分 ...

  2. JVM学习04:类的文件结构

    JVM学习04:类的文件结构 写在前面:本系列分享主要参考资料是  周志明老师的<深入理解Java虚拟机>第二版. 类的文件结构知识要点Xmind梳理 转载于:https://www.cn ...

  3. JVM学习笔记(四)

    JVM学习笔记(四) 文章目录 JVM学习笔记(四) 笔记链接 1.GC算法 1.1GC-判断对象是否可回收 1.1.1 引用计数法 1.1.1 可达性分析 1.2GC-回收算法 标记清除法(Mark ...

  4. jvm学习笔记(二)

    jvm学习笔记(二) 文章目录 jvm学习笔记(二) 1.全部笔记链接 2. Native关键字 3.关于JVM规范 3.1 JVM规范中运行时数据区的概念 4.HotSpot的JVM运行时数据区 4 ...

  5. jvm学习笔记(一)

    jvm学习笔记(一) 文章目录 jvm学习笔记(一) 1.全部笔记链接 3.类加载器 作用 类别 加载步骤 获得类加载器 4.双亲委派机制 5.沙箱安全机制 沙箱概念 JAVA沙箱的基本组件 基本组件 ...

  6. JVM学习笔记-03-类加载器及双亲委派机制

    JVM学习笔记-03-类加载器及双亲委派机制 文章目录 JVM学习笔记-03-类加载器及双亲委派机制 1. 类加载器 视频链接-最新JVM教程IDEA版[Java面试速补篇]-03-类加载器及双亲委派 ...

  7. 【JVM学习笔记】内存回收与内存回收算法 就哪些地方需要回收、什么时候回收、如何回收三个问题进行分析和说明

    目录 一.相关名词解释 垃圾收集常用名词 二.哪些地方需要回收 本地方法栈.虚拟机栈.程序计数器 方法区 Java堆 三.什么时候回收 1. 内存能否被回收 内存中的引用类型 引用计数算法 可达性分析 ...

  8. JVM学习笔记汇总:结合尚硅谷宋红康老师视频教程及PPT

    JVM学习笔记汇总:结合尚硅谷宋红康老师视频教程及PPT 第一章:JVM虚拟机的介绍 1.1虚拟机的分类 虚拟机通常分为两类:系统虚拟机和程序虚机.其中,系统虚拟机是指完全对物理计算机的仿真,而程序虚 ...

  9. JVM学习笔记(自用)

    JVM学习笔记(自用) 文章目录 JVM学习笔记(自用) 1.简介 2.程序计数器 3. 虚拟机栈 4. 方法区 5. 直接内存 6. 垃圾回收 Young Collection Young Coll ...

最新文章

  1. 好用的Span(富文本)api
  2. 统计学习方法第十一章作业:随机条件场—概率计算问题、IIS/GD学习算法、维特比预测算法 代码实现
  3. vnc安装mysql_centos 6.7安装与配置vncserver
  4. 华为云瑶光:打通云边端界限,为企业云上业务带来最优解
  5. tfhpple解析html中的图片,图文详解使用TFHpple解析html方法
  6. easyui被activeX控件挡住的解决方法
  7. mysql 5.6 TIMESTAMP
  8. Struts(十一):OGNL表达式(二)
  9. 统计学的Python实现-013:频度分布表
  10. hp打印机驱动android,惠普打印机驱动
  11. 逻辑教育大厂必备IOS面试突击班
  12. 语音合成 TTS 相关的一些总结
  13. 上位机PC控制UR3机器人实现方式
  14. 自然语言处理系列五》新词发现与短语提取》短语提取
  15. 电脑win7做系统备份
  16. C# 调用Everything查找文件
  17. 网络革命:软件定义网络与网络虚拟化
  18. idea新增目录文件不能提交
  19. 西门子SCL编程:SCL编写的DCS电机块
  20. 海南省专业技术人员职称计算机,[海南省人力资源和社会保障厅]关于完善专业技术人员计算机应用能力考试有关规定通知琼人社发[2012]147号...

热门文章

  1. 航空航天工业科研项目管理探析
  2. 凭借这份pdf,必拿下蚂蚁金服、字节跳动、小米等大厂的offer
  3. Html5浪漫结婚请柬婚礼网站模板❤_爱她就给她最美的H5婚礼请柬_(婚庆电子邀请函)含背景音乐
  4. 《ENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentation》论文笔记
  5. 【Rhapsody学习笔记(三)】常用通讯点
  6. 昂达vi40精英版刷Linux,昂达VI40双核版刷机教程
  7. c语言p1口亮灯,单片机实验开发与微机原理接口技术综合实验装置,上海求育
  8. QT5.12+opencv4.0.1 Cielab空间 像素颜色信息
  9. Delphi初学者,向万一老师致敬
  10. 模拟电子技术读书笔记