public class Math {
public int compute(){
int a = 1;
int b = 2;
int c= (a + b) * 10;
return c;
}
public static void main(String[] args) {
Math m = new Math();
m.compute();
System.out.println("Math.class");
}
}
通过javap -c 对代码进行反汇编成可读性更高的字节码文件
javap -c Math.class > Math.txt
Compiled from "Math.java"
public class com.community.Math {
public com.community.Math();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public int compute();
Code:
0: iconst_1 //将int型(1)压入操作数栈
1: istore_1 //将操作数栈顶int型数值出栈存入1这个位置局部变量
2: iconst_2
3: istore_2
4: iload_1 //将局部变量1位置的值装载出来放入操作数栈
5: iload_2
6: iadd //将栈顶两int型数值相加并将结果压入栈顶
7: bipush 10 //将单字节的常量值(-128~127)推送至栈顶
9: imul //将栈顶两int型数值相乘并将结果压入栈顶
10: istore_3
11: iload_3
12: ireturn
public static void main(java.lang.String[]);
Code:
0: new #2 // class com/community/Math
3: dup
4: invokespecial #3 // Method "<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #4 // Method compute:()I
12: pop
13: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;
16: ldc #6 // String Math.class
18: invokevirtual #7 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
21: return
}
方法中局部变量都会在此分配内存空间
局部变量表中还存放着this对象
操作数栈 :记录数据运算轨迹
动态链接:将符号引用转换为直接引用-》比如说调用一个方法时;动态链接存放的就是方法区内指向此方法代码的物理地址
方法出口:方法执行结束后,继续执行代码的位置。
-
为什么要设置一个程序计数器?
线程执行到某处代码时,cpu被其他线程抢占,可恢复执行代码的位置(由字节码执行引擎修改程序计数器指向的行号)
-
虚拟机是如何计算并回收垃圾的?
字节码执行引擎专门开辟一个低优先级的线程去收集计算垃圾 -
分代年龄存储在哪里?
java对象的组成结构
- web系统里面那些对象一般都会被放在老年代?
spring容器创建的一些Bean对象,线程池,缓存池引用的对象,包括一些静态变量等等。