JAVA虚拟机学习笔记之Class文件结构及字节码指令

1、java虚拟机的语言无关性:Java虚拟机不任何语言绑定,它只与class这种特定二进制文件格式关联,能运行任何功能性语言编译生成的符合java虚拟机规范的class文件
2、class文件是以8位字节为基础单位的二进制流,文件格式采用类似C语言结构体的伪结构来存储,只有无符合数和表两种数据类型,具体结构如下

ClassFile {
          u4 magic;//魔数
          u2 minor_version;//次版本号
          u2 major_version;//主版本号
          u2 constant_pool_count;//常量池数量
          cp_info constant_pool[constant_pool_count-1];//常量池集合
          u2 access_flags;//访问标识
          u2 this_class;//类索引
          u2 super_class;//父类索引
          u2 interfaces_count;//接口数量
          u2 interfaces[interfaces_count];//接口索引集合
          u2 fields_count;//字段表数量
          field_info fields[fields_count];//字段表集合
          u2 methods_count;//方法数量
          method_info methods[methods_count];//方法合集
          u2 attributes_count;//属性数量
          attribute_info attributes[attributes_count];属性合集
}

3、字节码执行流程

do {
	自动计算PC寄存器的值加1;
	根据PC寄存器的指示位置,从字节码流中取出操作码;
	if(字节码存在操作数) 从字节码中取出操作数;
	执行操作码定义的操作;
} while(字节码长度>0)

4、由于java虚拟机操作码长度只有一位,所以为了减少指令数量,虚拟机指令集对特定操作只提供有限类型相关指令去支持,将不支持类型转换为支持的类型。因此,大多数对boolean、byte、short、char类型的操作都是转换为int完成的
5、虚拟机直接支持宽化类型转换,处理窄化类型转换需要显式转换指令,窄化过程可能会产生不同正负号、数量级和精度丢失
6、字节码操作指令

  • *load,*load_:加载指令,将一个局部变量加载到操作栈,代表一组指令,如iload_代表iload_0,iload_1,iload_2,iload_3
  • *store,*store_:存储指令,将一个数值从操作数栈存储到局部变量
  • const_<>, aconst_null, iconst_m1,bipush,sipush,ldc,ldc_w,ldc_2w,将一个常量加载到操作数栈
  • *add加法指令,*sub减法指令,*mul乘法指令,*div除法指令,*rem求余指令,*neg取反指令,*shl/*shr位移指令,ior/lor按位或,iand/land按位与,ixor/lxor按位异或,iinc自增,dcmpg/dcmpl/fcmpg/fcmpl/lcmp比较指令
  • wide:扩充局部变量表的访问索引
  • new、newarray、anewarray、multianewarray,创建指令
  • getFiled、putField、getStatic、putStatic,访问字段指令
  • *aload,将数组元素加载到操作数栈指令,例如iaload、laload
  • *astore,将操作数栈的值存储到数组元素,例如iastore、lastore
  • arraylength,取长指令
  • instanceof、checkcast,类型检查指令
  • pop,popn,操作数栈出栈指令、n代表数量
  • dupn_xn,复制栈顶值并入栈
  • swap,栈顶两个值互换
  • if*、switch、goto、jsr*,控制转移指令
  • invoke*,方法调用指令
  • *return,返回指令
  • athrow,异常处理指令
  • monitorenter、monitorexit,同步指令
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值