JVM学习条记之栈区

本文主要内容:

栈是什么?栈帧又是什么?在JVM中,main方式挪用say方式后,是怎么运行的?本文将详细解说栈。希望人人学了之后,对栈有更深的领会。

心法:在JVM中,栈管运行,堆管存储。

栈数据结构特点:先进后出。生涯中常见的case就是弹夹。最后一个压进弹夹的子弹,最先出弹夹。

Stack栈:
栈也叫栈内存,主管Java程序的运行,是在线程建立时建立,它的生命周期追随线程的生命周期,线程竣事,栈内存也就被释放了。对于栈来说,不存在垃圾接纳问题,只要是线程一竣事,该栈就over了。生命周期和线程一直的,是线程私有的。

8中基本类型的变量+工具的引用变量+实例方式都是在函数的栈内存中分配的。

栈中存储的是什么?

在领会栈之前,先来领会另一个观点:栈帧。

栈帧

栈帧(Stack Frame):用于支持虚拟机举行方式挪用和方式执行的数据结构。它是虚拟机运行时数据区中的虚拟机栈的栈元素。

栈帧存储了方式的局部变量表、操作数栈、动态毗邻和方式返回地址等信息。每个方式从挪用最先至执行完成的历程,都对应这一个栈帧在虚拟机栈内里从入栈到出栈的历程。

额,什么叭叭叭的,说的什么意思呢?简朴如下:

栈帧中主要保留3类数据:

内陆变量(Local variables):输入参数和输出参数以及方式内的变量;

编辑

如上图中的 int x,int y就是输入参数

Int result就是输出参数。

其中的X、Y、result都是方式内的变量

栈操作(Operand Stack):纪录出栈、入栈的操作;

栈帧数据(fram Date):包罗类文件、方式等等。

栈运行的原理:

栈中的数据都是以栈帧的花样存在,栈帧是一个内存区块,是一个数据集,是一个有关方式(Method)和运行期,数据的数据集。

当一个方式A被挪用的时刻,就发生了一个栈帧F1,并被压到栈中;

A方式挪用了B方式,于是发生了栈帧F2也被压入栈中;

B方式又挪用了C方式,于是发生栈帧F3,也被压入到栈中;

依次类推。

当执行完毕后,先弹出F3栈帧,在弹出F2栈帧,在弹出F1栈帧。依次类推。

遵照”先进后出/后进先出”的原则。

代码演示:

写个main函数,在main方式中,挪用say方式。然后查看输出效果。

,

联博统计

www.yiyauan.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。

,

编辑

运行效果:

编辑

当程序运行到3行的时刻,挪用了主线程main函数,这个时刻发生了栈帧F1,被压入栈,代码继续向下走;

当代码执行到第5行的时刻,挪用了say方式,这个时刻发生了栈帧F2,发现后面另有代码需要执行,F2就被压入栈;

当执行第10行的时刻,say方式挪用了showCode方式,这个时刻就发生了F3。进入方式showCode方式后,后面另有代码,F3压栈,继续执行。

当执行到第17行的时刻,发现没有需要执行的了。F3就从栈内里被弹出栈了;

接着回到say方式内里,继续执行,程序走到第12行的时刻,发现say方式执行完成了,于是F2就被弹出栈了;

程序回到main方式中,也就是该执行第6行了,执行完第6行,当到底7行的时刻,发现主函数也执行了了,于是F1就被弹出栈了;

整个线程执行完成,栈区被清空。程序竣事。如下图:

编辑

一个线程中的方式挪用链可能会很长,许多方式都同时处于执行状态。对于执行引擎来说,在流动线程中(争抢到CPU执行权的),只有位于栈顶的栈帧才是有用的,成为当前栈帧(Current Stack Frame),与这个栈帧相关联的方式称为当前方式(Current Method)。执行引擎运行的所有字节码指令都是只针对于当前栈帧举行操作的。

栈帧观点模型如下图:

编辑

需要说明的是:每个方式执行的同时都市建立一个栈帧,用于存放局部变量表、操作数栈、动态毗邻、方式返回等等数据。每个方式从被挪用至执行完成的历程,就对应着一个栈帧在虚拟机中入栈和出栈的历程。栈的巨细和详细JVM的实现有关,通常在256K~756K之间,约等于1Mb左右。

栈+堆+方式区的交互关系

编辑

HotSpot是使用指针的方式来接见工具的:

Java堆中会存放接见类元数据的地址,reference存放的就直接是工具的地址。