JVM运行时数据区和常用指令

JVM stack

pc:程序计数器

VMS:栈帧

heap:堆

method area ( 1.7前叫:perm space,1.8之后叫:meta space):方法区

Frame 每个方法对应一个栈帧

1. Local Variable Table 局部变量表
2. Operand Stack  操作栈
   对于long的处理(store and load),多数虚拟机的实现都是原子的
   jls 17.7,没必要加volatile
3. Dynamic Linking  
    https://blog.csdn.net/qq_41813060/article/details/88379473 
   jvms 2.6.3
4. return address  返回地址
   a() -> b(),方法a调用了方法b, b方法的返回值放在什么地方

字节码常用指令

bipush 将单字节的常量值(Byte.MIN_VALUE ~ Byte.MAX_VALUE,即 -128~127)推送至栈顶。eq: bipush 1
sipush 将短整型的常量值(Short.MIN_VALUE ~ Short.MAX_VALUE,即 -32768~32767)推送至栈顶. eq: sipush 300

load  : _load   _ : 数据类型

iload_0 将第一个 int 型局部变量推送至栈顶

const :  _const   _ : 数据类型

iconst_0 将 int 型 0 推送至栈顶

 store  :  _store  _ : 数据类型

  istore_0 将栈顶 int 型数值存入第一个局部变量
pop 将栈顶数值弹出(数值不能是 long 或 double 类型的)
pop2 将栈顶的一个(对于 long 或 double 类型)或两个数值(对于非 long 或 double 的其他类型)弹出
dup 复制栈顶数值并将复制值压入栈顶

 add  :  _add  _ : 数据类型

iadd 将栈顶两 int 型数值相加并将结果压入栈顶
nvokevirtual 调用实例方法
invokespecial 调用超类构造方法,实例初始化方法,私有方法
invokestatic 调用静态方法
invokeinterface 调用接口方法

猜你喜欢

转载自blog.csdn.net/dandanforgetlove/article/details/106098576