JVM结构

25 阅读2分钟

陆陆续续背了一些八股文把,但是具体细节一问就不知道了,关于jvm自己看了一些文章,也看来一些介绍视频,现在觉得可以来个分享。

jvm整体图示是这样的

image.png

我们可以知道new的东西在堆里面

栈里面放的是线程运行的变量(1个线程就对于一个栈),栈的但是是栈帧。

image.png

如图示,我们结合具体代码进行相关介绍。

比如int a=1;

我们先把1放在操作数栈里面

image.png

然后新建一个变量a放在局部变量里面,然后把操作数栈里面的1出栈,赋值给a,完成int a=1;

image.png

同理我们可以完成b=2

image.png

接下来c=a+b,我们拿到ab的值,通过加法运算得到3,把三先放在操作数栈,然后出栈,声明c局部变量,放在局部变量被,进行赋值。

image.png

但是其实我们每一个线程也有自己的程序计数器,里面保存的是下一次执行的位置。另外当线程被挂起后,恢复执行时候也会用到中国程序计数器。

程序计数器是怎么修改的呢?

是由字节码执行引擎在重新运行过程里面动态修改的

那么通过代码我们可以发现,在main函数里面还有一个对象,这个对象t1是局部变量,但是他的值我们是一个地址,因为new的一个地址放在堆里面

所以栈里面可能会有执行堆的引用。

动态链接其实就是把符号引用变成直接引用,但是这个引用可能是地址,同理,在进行方法的时候也可能有对象存在,所以方法区也可能引用堆里面的东西

image.png

方法出口,就是记录下一行执行的位置

image.png

本地方法栈:用关键字native修饰的代码放在本地方法栈。

方法区属于是 JVM 运行时数据区域的一块逻辑区域,是各个线程共享的内存区域。当虚拟机要使用一个类时,它需要读取并解析 Class 文件获取相关信息,再将信息存入到方法区。方法区会存储已被虚拟机加载的 类信息、字段信息、方法信息、常量、静态变量、即时编译器编译后的代码缓存等数据

栈、本地方法栈、重新计数器是私有的。堆、方法区是共享的