## 常用java命令
javac :编译java代码。
java:运行编译后的字节码文件,.class文件。
javap -c :查看字节码文件
备注:查看字节码文件执行过程参照《jvm命令指令文档》
名称解释
线程栈:栈为每个线程分配内存,所以更像是线程。习惯叫它线程栈。
局部变量表:存放局部变量
操作数栈:数据操作
动态链接:
方法出口:
字节码执行流程
以Compute()方法为例
原方法如下:
public int compute() {
int a = 1;
int b = 2;
int c = a * b * 10;
return c;
}
编译后的字节码文件如下:
public int compute();
Code:
0: iconst_1 将int类型常量1压入栈 //将a 压入栈中
1: istore_1 将int类型值存入局部变量1 // 将1赋值给a
2: iconst_2 将int类型常量2压入栈 //将 b压入栈中
3: istore_2 将int类型值存入局部变量2 //将2赋值给b
4: iload_1 从局部变量1中装载int类型值 //从a装载1
5: iload_2 从局部变量2中装载int类型值 //从b装载2
6: imul 执行int类型的乘法 ab
7: bipush 10 送到栈顶
9: imul 乘 ab10
10: istore_3 将int类型值存入局部变量3 //ab*10存入局部变量3中
11: iload_3 从局部变量3中装载int类型值 将局部变量赋值给3
Jvm结构图
第一次画,请多指教
执行流程描述:
1: 通过javac命令将.java文件进行编译生成.class字节码文件。
2:通过jvm中类加载子系统进行加载(classLoader)
3:执行main方法,jvm为main主线程分配栈内存空间
4:秉承栈的特点FIOU main方法栈帧分配的栈帧内存压入栈底。
5:compute()方法也分配了对应的栈帧。
6:main栈帧局部变量表中存储main方法的局部变量地址。
对象存放在堆中。
7:compute()栈帧中 局部变量表中存在了 a,b,c变量。
8:操作数栈用于a,b,c的操作。
9:compute()方法执行完成,跳出栈释放内存。
10:main()方法在compute()方法之后执行完成,跳出栈释放内存。
11:堆中的对象没有引用,通过minor GC将内存释放。
11:到此执行流程结束。
下一个文章记录频繁GC的场景及如何优化