JVM stack
![](https://img-blog.csdnimg.cn/20200513150832564.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhbmRhbmZvcmdldGxvdmU=,size_16,color_FFFFFF,t_70)
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 _ : 数据类型
store : _store _ : 数据类型
|
istore_0 |
将栈顶 int 型数值存入第一个局部变量 |
pop |
将栈顶数值弹出(数值不能是 long 或 double 类型的) |
pop2 |
将栈顶的一个(对于 long 或 double 类型)或两个数值(对于非 long 或 double 的其他类型)弹出 |
add : _add _ : 数据类型
iadd |
将栈顶两 int 型数值相加并将结果压入栈顶 |
invokespecial |
调用超类构造方法,实例初始化方法,私有方法 |