對於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方法。