JVM的组成部分
首先了解一下JVM的组成部分
栈的组成部分
栈帧:每次调用一个方法会在栈中分配一个栈帧,栈中最多只能有一个活动栈帧,方法完全结束后会弹出栈
字节码指令简介
从字节码角度分析 a++ 相关题目
iinc 指令是直接在局部变量slot上进行运算
javap java中的反编译命令
数字在-32768-32767的数字是和字节码一起存储的,其他存储在运行时常量池中,变量和方法存储也载入到运行时常量池中
字节码会放在方法区中
main方法运行,分配一个栈帧内存,local4表示局部变量表示分配了4个槽位,stack=2表示分配了深度为2的操作数栈
bipush 将一个byte类型的数压入到操作数栈
sipush 将一个short类型的数压入到操作数栈
ldc 压入的是int型
ldc2_w 压入long类型,8个字节,压入两次
istore_1 将操作数栈顶数据弹出,存入到局部变量表的slot1槽位
ldc #3将运行时常量池中#3数据压入到操作数栈
iload_1 和iload_2通过执行引擎读取局部变量表中对应的数据到操作数栈
iadd 弹出操作数栈的两个数据,并将结果存到操作数栈
istore_3 将结果从操作数栈中取出来放到局部变量表的槽位3
getstatic #4 将堆中的引用放入到操作数栈
iload_3 将局部变量表中槽位3中的结果32778读取到操作数栈中
invokevirtual #5 给方法分配一个新的栈帧
执行完毕,弹出栈帧
清除main操作数栈的内容
rerun 完成main方法调用,弹出栈帧,程序结束
题目源码:
package cn.itcast.jvm.t3.bytecode; /*** 从字节码角度分析 a++ 相关题目 */
public class Demo3_2 {
public static void main(String[] args) {