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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值