码迷,mamicode.com
首页 > 其他好文 > 详细

JVM内存模型的那些事

时间:2020-07-27 23:53:29      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:javap   加载   展开   变量   iad   ilo   rgs   内存模型   程序   

  阅读相关资料,自己先画了一个jvm内存模型草图

技术图片

 

 

 

 

 

  类装在子系统不过多解释,上一篇类加载机制说的就是这个。

  字节码执行引擎(执行编译好后class文件指令码的程序),为C语音实现,不可见,不展开讲,下面主要来看内存模型中的5块。

  

  芜湖起飞~

 

  先从栈开始讲:

    栈后面加了个括号,线程,栈就是线程在执行方法的时候存放的一些方法内部的局部变量。

    当一个线程执行方法,会在栈里面开辟这个线程的栈空间。栈中有n个线程方法空间,我们看下面的程序

 

public class Stack {


    public int add() {
        int a =1;
        int b = 2;
        int c = (a+b) * 2;
        return c;
    }



    public static void main(String[] args) {
        Stack stack = new Stack();

        stack.add();
    }

}

  我们执行main函数,开启主线程,这个时候,栈会开辟一个main线程空间,如下图:

技术图片

 

 

 

  这里来解释一个重要的概念:先进后出。

    我们看程序,先执行main方法:这时候,main方法栈帧入栈(栈帧:每个线程开启时对应的方法内存区域)

技术图片

 

 

 

 

 

   然后main方法调用add方法,这个时候add方法入栈:

技术图片

 

 

  然后add方法执行完了,add方法出栈:

 

技术图片

 

 

 

  最后是main方法执行完成,main方法出栈:

技术图片

 

 

  上面这个过程很好的解释了栈的先进后出的概念。

 

 

  上图中每一个方法在对应线程的栈空间中都有与之相对应的栈帧,那么栈帧中又有啥呢?看下图:

技术图片

 

   

   里面有一些东西,为了更方便弄懂这些,我们来做以下操作:

    1:打开cmd,进入到Stack类的字节码文件所在地;

    2:执行javap -c Stack.class > Stack.txt;

    3:打开Stack.txt文件;

    4:打开java指令码操作手册(没有的百度);

   这个时候我们可以来看Stack.txt里面都是啥:

Compiled from "Stack.java"
public class com.ghsy.user.test.Stack {
  public com.ghsy.user.test.Stack();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public int add();
    Code:
       0: iconst_1
       1: istore_1
       2: iconst_2
       3: istore_2
       4: iload_1
       5: iload_2
       6: iadd
       7: iconst_2
       8: imul
       9: istore_3
      10: iload_3
      11: ireturn

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class com/ghsy/user/test/Stack
       3: dup
       4: invokespecial #3                  // Method "<init>":()V
       7: astore_1
       8: aload_1
       9: invokevirtual #4                  // Method add:()I
      12: pop
      13: return
}

 

 

 

 

  

JVM内存模型的那些事

标签:javap   加载   展开   变量   iad   ilo   rgs   内存模型   程序   

原文地址:https://www.cnblogs.com/ghsy/p/13387005.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!