
作者|杨遥
JVM是什么

栈区
栈区主要存放4个东西:局部变量表,操作数栈,动态链接,方法出口。
比如我们一个方法有int a =1; int b =2 ; int c =a+b;这段代码
这些变量是不是需要内存来存放,局部变量表主要是存放以下内容

操作数栈
操作数栈主要是用来操作JAVA代码计算的过程。如上代码javap反编译后就是这样子
0:iconst_1
1:istore_1
2:iconst_2
3:istore_2
4:iconst_3
5:iadd
查官方手册之后就是iconst_1定义常量1,istore_1存储常量1也就是a=1的过程吧,iadd就是把a和b相加,相加的过程主要是通过操作数栈来完成这么一个过程。所以你可以直接理解操作数栈就是JAVA计算变量的一个过程,计算完成之后,出栈,销毁。

动态链接
程序运行的时候可能依赖其他类,而此时只是一个符号引用,动态链接的就是把符号引用转换成直接引用。下次需要的时候直接找到内存地址。
public static void main(String[] args) {test();System.out.println(1);}private static void test() {System.out.println("test方法");}
首先main方法入栈,然后test方法入栈,test执行完之后,test出栈释放内存,程序怎么知道我接口代码该回到那里呢,这时候就需要方法出口记录了,执行完test方法后还能回到输出语句继续执行。图解应该是下面这样的

本地方法栈
底层主要是C语言或者C++实现,由JAVA直接调用方法,如native修饰的方法

方法区(元空间)
JDK7以前方法区属于运行时数据区。到了JDK8改名叫元空间,使用的直接物理内存。主要存放一些类加载信息,静态变量,常量等。
程序计数器
线程私有,可以直接理解为当前线程执行代码的行号。现在我们的系统都是多核的,可能一个线程没有执行完当前代码,被其他线程抢占了CPU,等到再次抢到cpu时,能继续接着上次执行。




