深入理解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方法。

 

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