深入理解JVM內存模型-----舉例說明

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章