java虚拟机(三)

145 阅读2分钟

这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战

前言

这是jvm篇章的第三章,前面我们讲了方法区和堆,这一篇章我们继续讲一下运行时数据区域的其他部分,继续复用之前的图片。

image.png

虚拟机栈

虚拟机栈是属于线程隔离区域的一块空间,线程隔离也就意味着每一个线程进来这片空间就是独立的,线程之间不共享。与堆和方法区不同,这块空间底层使用的数据结构是栈,栈的特点是先进后出,后进先出。每一个方法进入虚拟机栈会产生一个栈帧,每一个栈帧里面有局部变量表、操作数栈、动态链接、方法出口这些内容。得益于栈的数据结构,这片区域GC并不会涉及到,因为方法执行完会自动弹栈,并不会留下内存碎片,入栈的操作本身就是连续的。

这里讲一下入栈与出栈,有些人对栈的这个概念还不是很懂,我拿一个很好懂的例子,当然这个例子也是我当初在某博文看到dalao举的例子。首先把栈比作一把枪,在具体一点是枪的弹匣,每次装填子弹是由上到下的过程,也就是入栈的过程,而射出去的子弹是从最上方的子弹射出去,也就是出栈。中间的子弹就是栈帧。

本地方法栈

本地方法栈也是属于线程隔离的一块空间,底层数据结构与虚拟机栈一致,只不过本地方法栈大多数存放的是native方法调用的本地c语言方法,但是在虚拟机规范中是没有强制规定实现这个栈,也就是其实可以不实现这个栈转而直接使用虚拟机栈去存放native方法也是可以的,比如我们常用的Hot Spot虚拟机就是把两个栈合在一起了

程序计数器

程序计数器有点类似cpu中的寄存器,他是线程隔离的一块空间,他的作用与寄存器类似,是为了保存java多线程的一个上下文切换内容,为了记录java线程执行到什么位置,在他时间片用完之后切换到另一个进程,然后在切回来继续执行之前的任务。

至此虚拟机的运行时数据区域就讲完了。