一个方法内执行JVM指令详解
2021-07-06 14:59:11 0 举报
祝奋斗中的您,步步高升!
作者其他创作
大纲/内容
1
int a=1
4
5
方法出口
计算结果压栈
compute()栈帧
局部变量表
赋值
a+b --> 1+2 = 3
30
记录当前线程执行位置
此方法内调用的其他方法链接
编译javap
main线程
操作数栈
public int compute(); Code:#图一 0: iconst_1 -->将int类型常量1压入操作数栈 1 1: istore_1 -->将int类型值存入局部变量1 int a 2: iconst_2 -->将int类型常量2压入栈 2 3: istore_2 -->将int类型值存入局部变量2 int b#图二 4: iload_1 -->从局部变量1中装载int类型值 int a = 1 5: iload_2 -->从局部变量2中装载int类型值 int b = 2#图三 6: iadd -->执行int类型的加法 a+b 7: bipush 10 -->将一个8位带符号整数压入栈 没有8是因为 要压栈的10 也占位#图四 9: imul -->执行int类型的乘法 (a+b)* 10 10: istore_3 --> 将int类型值存入局部变量3 30 11: iload_3 -->从局部变量3中装载int类型值 int c = 30 12: ireturn --> 从方法中返回int类型的数据 30
2
public int compute() { int a = 1; int b = 2; int c = (a + b) * 10; return c; }
int b=2
int b
图三
int a
9
10
7
0
动态链接
6
栈(线程)
Math math = new Math();
/** * @Author cr * @Date 2021/6/11 13:55 */public class Math { public static final int initData = 666; public static User user = new User(); public int compute() { //一个方法对应一块栈帧内存区域 int a = 1; int b = 2; int c = (a + b) * 10; return c; } public static void main(String[] args) { Math math = new Math(); int i = math.compute(); System.out.println(i); }}
编译
程序计数器
当前方法内部变量
math对象在堆中的地址
int c=30
3
在操作数栈中取出操作数计算
3*10=30
图二
图一
main()栈帧
简单分析方法 compute() 在 栈(线程) 中的操作对照JVM指令手册分析
当前方法是谁调用了,执行完要回到哪里
图四
Compiled from \"Math.java\"public class cn.cr.Math { public static final int initData; public static cn.cr.User user; public cn.cr.Math(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object.\"<init>\":()V 4: return public int compute(); Code: 0: iconst_1 1: istore_1 2: iconst_2 3: istore_2 4: iload_1 5: iload_2 6: iadd 7: bipush 10 9: imul 10: istore_3 11: iload_3 12: ireturn public static void main(java.lang.String[]); Code: 0: new #2 // class cn/cr/Math 3: dup 4: invokespecial #3 // Method \"<init>\":()V 7: astore_1 8: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream; 11: aload_1 12: invokevirtual #5 // Method compute:()I 15: invokevirtual #6 // Method java/io/PrintStream.println:(I)V 18: return static {}; Code: 0: new #7 // class cn/cr/User 3: dup 4: invokespecial #8 // Method cn/cr/User.\"<init>\":()V 7: putstatic #9 // Field user:Lcn/cr/User; 10: return}Process finished with exit code 0
当前方法内部需要操作数据的存放
收藏
0 条评论
下一页