标签: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 }
标签:javap 加载 展开 变量 iad ilo rgs 内存模型 程序
原文地址:https://www.cnblogs.com/ghsy/p/13387005.html