Java
时间不等人,一晃眼开学大四了,哭辽😭,认真学Java👍,今天看了视频JVM如何调优,果然JVM很重要🤦♀️
IDEA转换底层文件
- 首先写个简单类,重点理解如何转换底层文件,JavapTest.class
public class JavapTest {
public void test(){
int a = 10;
int b = 20;
int c = (a + b) * 10;
System.out.println(c);
}
public static void main(String[] args) {
JavapTest javapTest = new JavapTest();
javapTest.test();
}
}
-
运行后文件会在包的out文件夹下产生JavapTest.class
-
可以把class字节码文件复制到包目录下,便于转换
-
到IEDA的控制台Terinal下输入javap命令
-输入javap -c JavapTest.class > javaptest.txt,把class文件转换成txt方便查看, -
到包目录下会产生一个class文件,打开里面就是代码的底层源码。
-
打开查看根据指令手册得到栈中栈帧的过程。
public void test();
Code:
0: bipush 10
2: istore_1 //istore_1 将int类型值存入局部变量1
3: bipush 20
5: istore_2
6: iload_1 //iload_1 从局部变量1中装载int类型值
7: iload_2
8: iadd //iadd 执行int类型的加法
9: bipush 10
11: imul //imul 执行int类型的乘法
12: istore_3
13: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
16: iload_3
17: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
20: return
JVM指令手册
1. 栈和局部变量操作
1.1 将常量压入栈的指令
aconst_null 将null对象引用压入栈
iconst_m1 将int类型常量-1压入栈
iconst_0 将int类型常量0压入栈
iconst_1 将int类型常量1压入栈
iconst_2 将int类型常量2压入栈
iconst_3 将int类型常量3压入栈
iconst_4 将int类型常量4压入栈
iconst_5 将int类型常量5压入栈
lconst_0 将long类型常量0压入栈
lconst_1 将long类型常量1压入栈
fconst_0 将float类型常量0压入栈
fconst_1 将float类型常量1压入栈
dconst_0 将double类型常量0压入栈
dconst_1 将double类型常量1压入栈
bipush 将一个8位带符号整数压入栈
sipush 将16位带符号整数压入栈
ldc 把常量池中的项压入栈
ldc_w 把常量池中的项压入栈(使用宽索引)
ldc2_w 把常量池中long类型或者double类型的项压入栈(使用宽索引)