JVM学习笔记之栈区
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方法。然后查看输出结果。
运行结果:
当程序运行到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存放的就直接是对象的地址。
JVM学习笔记之栈区的更多相关文章
- JVM学习笔记:虚拟机的类加载机制
JVM类加载机制分两部分来总结: (1)类加载过程 (2)类加载器 一.JVM类加载过程 类的加载过程:加载 →连接(验证 → 准备 → 解析)→ 初始化. 类的生命周期:加载 →连接(验证 → 准备 ...
- JVM学习笔记:字节码执行引擎
JVM学习笔记:字节码执行引擎 移步大神贴:http://rednaxelafx.iteye.com/blog/492667
- JVM学习笔记(四)------内存调优【转】
转自:http://blog.csdn.net/cutesource/article/details/5907418 版权声明:本文为博主原创文章,未经博主允许不得转载. 首先需要注意的是在对JVM内 ...
- JVM学习笔记(四)------内存调优
首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提 ...
- java jvm学习笔记七(jar包的代码认证和签名)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前言: 如果你循序渐进的看到这里,那么说明你的毅力提高了,jvm的很多东西都是比较抽像的,如果不找相对应的代码来辅助理解 ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- java之jvm学习笔记五(实践写自己的类装载器)
java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
随机推荐
- vba--分拆工作薄
Sub 分拆工作薄() '分拆工作薄到当前文件夹 Dim sht As Worksheet Dim MyBook As Workbook Application.DisplayAlerts = Fal ...
- 光伏储能电厂设备连接iec61850平台解决方案
在当今日益发展的电力系统中,光伏储能技术以其独特的优势逐渐崭露头角,成为可再生能源领域的重要组成部分.而在光伏储能系统的运行与监控中,通信协议的选择与实现则显得至关重要.本文将重点介绍光伏储能系统中的 ...
- AT_abc318_g 题解
因为是图上路径是否经过某个点的问题,所以考虑建出圆方树,然后根据圆方树的性质,\(a\) 到 \(c\) 存在经过 \(b\) 的路径等价于 \(a,c\) 在圆方树上的路径经过 \(b\) 或者 \ ...
- [oeasy]python0023_[趣味拓展]Guido的简历_从ABC到python
Guido的简历 回忆上次内容 上次 添加了 各种 符号 铭文 各种 颜色 铸造了 自己的宝剑 添加图片注释,不超过 140 字(可选) 这些都是 用python画出来的宝剑 py ...
- Day 8 - 并查集、堆、set 与 map
并查集 引入 并查集是一种用于管理元素所属集合的数据结构,实现为一个森林,其中每棵树表示一个集合,树中的节点表示对应集合中的元素. 顾名思义,并查集支持两种操作: 合并(\(\text{Union}\ ...
- CF709B 题解
洛谷链接&CF 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 给定 \(N\) 个点,在一条数轴上,位置为 \(x_1,-,x_n\),你的位置为 \(p\) ...
- 踩坑记录:windows11下使用 VS2022 和 PCL1.14.1 配置点云开发环境
闲话不多说,具体在windows下下载PCL与解压pcl可以看https://www.yuque.com/huangzhongqing/pcl/这位大佬的文章,那我就具体说一下踩过点坑: 踩坑点1: ...
- 假期小结2hadoop环境配置
记录一下hadoop配置 安装Java Development Kit(JDK):Hadoop是用Java编写的,所以首先需要安装JDK.可以从Oracle下载JDK,并按照安装说明进行安装. 下载 ...
- .NET 结果与错误处理利器 FluentResults
前言 在项目开发中,方法返回的结果(成功或失败)对我们开发来说很重要.传统方法,如通过异常来指示错误或使用特定的返回类型(如布尔值加输出参数),虽然有效,但可能缺乏直观性和灵活性. FluentRes ...
- 【Scala】05 对象特性Part2
特质重复继承关系 父类特质 A 子类特质B 继承 A 子类特质C 继承A 类D 继承了 B 又实现了 C class D extends B with C 继承顺序是 D 继承 C 继承 B 继承 A ...