对于java虚拟机的理解,一直停留在似懂非懂的阶段,只了解栈、堆、方法区、程序计数器这些名词,还有一些垃圾回收的算法之类,因为面试遇到一个问题,用一个例子说明java虚拟机的内存模型,每个部分分布在什么地方,这时候就一脸焖逼,所以本文就用一个例子举例来粗略的说明虚拟机的内存模型
首先例子如下:
public class JVM {
public static void main(String[] args) {
JVM jvm = new JVM();
jvm.method();
}
public int method() {
int a = 10;
int b = 20;
int c = (a + b) * 2;
return c;
}
}
这段代码的执行结果大家很容易就能看出来,但是在这段代码的执行过程中,虚拟机究竟做了什么操作呢?
首先通过javap命令,将class文件进行反编译(前提是你已经将上面的代码进行javac编译成class文件),我们将反编译结果输出到JVM.txt中,命令为 :
javap -c JVM.class > JVM.txt
JVM.txt中的结果如下:
Compiled from "JVM.java"
public class JVM {
public JVM();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #2 // class JVM
3: dup
4: invokespecial #3 // Method "<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #4 // Method method:()I
12: pop
13: return
public int method();
Code:
0: bipush 10
2: istore_1
3: bipush 20
5: istore_2
6: iload_1
7: iload_2
8: iadd
9: iconst_2
10: imul
11: istore_3
12: iload_3
13: ireturn
}
我们知道方法执行时会进行压栈,每个方法对应自己的栈帧,每个栈帧包含4部分,分别是局部变量表,操作数栈,动态链接和方法出口
首先main方法压栈,在main方法的invokevirtual指令调用到method方法。