理解JVM里的栈信息

文章目录

      • 栈内存的结构
      • 实际例子
        • 局部变量表(Local Variable Array)
        • 操作数栈(Operand Stack)
        • 动态链接(Dynamic Linking)
        • 方法返回地址(Return Address)
        • 其他信息
      • 调用示意图
      • 问题

栈内存的结构

Java 栈内存主要由多个栈帧(Stack Frame)组成,每个线程都有自己的独立栈内存。每个栈帧对应一次方法调用,包含以下几个部分:
局部变量区(Local Variables):
存储方法的参数、基本数据类型的局部变量以及对象引用(不包括对象本身)。
操作数栈(Operand Stack):
用于执行字节码指令时存储临时数据和计算结果。
动态链接(Dynamic Linking):
方法调用过程中用于支持方法之间的链接和调用。
方法返回地址(Return Address):
指示方法执行完毕后返回到调用者的指令地

实际例子

局部变量表(Local Variable Array)

局部变量表用于存储方法的参数和局部变量。每个变量在表中都有一个索引,通过索引可以快速访问变量值。局部变量表的大小在编译时确定,并且随着方法的调用和返回自动分配和回收。

基本数据类型:如 int、float、double 等,占用固定大小的空间。
引用类型:存储对象的引用(即指向堆中对象的指针)。
长整型和双精度浮点型:在局部变量表中占用两个槽(slot)。

public void exampleMethod(int a, double b) {int c = a + 5;double d = b * 2.0;
}

在上述方法中,局部变量表可能包含以下内容:

索引 内容

0	this(如果是实例方法)
1	a(int)
2	b(double,占用索引 234	c(int)
5	d(double,占用索引 56
操作数栈(Operand Stack)

操作数栈用于执行字节码指令时存储临时数据和计算结果。它是一个后进先出(LIFO)的栈,支持各种操作,如加载变量、执行算术运算、方法调用等。

示例:

java

复制代码
int a = 10;
int b = 20;
int c = a + b;

对应的字节码操作数栈操作可能如下:

将 a 加载到操作数栈。
将 b 加载到操作数栈。
执行加法操作,将结果压回操作数栈。
将结果存储到局部变量 c。

动态链接(Dynamic Linking)

动态链接用于支持方法调用过程中的符号引用解析。每个栈帧中包含一个指向运行时常量池(Runtime Constant Pool)的指针,用于解析方法调用时的符号引用。

方法返回地址(Return Address)

当一个方法调用另一个方法时,JVM 需要记录调用方法的下一条指令的位置,以便被调用的方法执行完毕后能够返回到正确的位置继续执行。返回地址就是用于存储这一信息的。

其他信息

包括异常处理信息、方法的出入口信息等,用于支持方法执行期间的各种功能。

调用示意图

public class StackFrameExample {public static void main(String[] args) {int result = add(5, 10);System.out.println("Result: " + result);}public static int add(int a, int b) {return a + b;}
}

最开始的方法在最下面

|---------------------------|
| println 方法栈帧          |
|---------------------------|
| add 方法栈帧              |
|---------------------------|
| main 方法栈帧             |
|---------------------------|

问题

  • 那在方法里new 的对象分配在哪里? 实际上还是在堆上,只有基本数据类型会分布在栈上
  • 大致可以估算下,上面的方法可以递归多少次

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/454633.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于PERL语言的MS中CASTEP模块批量提交计算脚本

在现代科学研究中,高效的计算工具对于推动科研进步具有不可估量的价值。为了满足广大科研工作者在材料科学、化学、物理等领域日益增长的计算需求,我们特别推出了一款基于Perl语言的MS CASTEP模块批量提交计算脚本。 一、批量提交,高效处理 …

Vulnhub打靶-Empire-LupinOne

基本信息 靶机下载:https://download.vulnhub.com/empire/01-Empire-Lupin-One.zip 攻击机器:192.168.20.128(Windows操作系统)& 192.168.20.138(kali) 提示信息: 这个盒子被创建为中等…

RNN,LSTM,GRU的区别和联系? RNN的梯度消失问题?如何解决?

RNN,LSTM,GRU的区别和联系? RNN(Recurrent Neural Network)、LSTM(Long Short-Term Memory)和GRU(Gated Recurrent Unit)都是用于处理序列数据的神经网络模型,它们之间…

《黑神话悟空》各章节boss顺序汇总

第一章BOSS顺序: 1、牯护院:犀牛精,位于苍狼岭娟,击败后能获得定身术。 2、广智:火刀狼, 位于观音禅院,击败后获得广智变身,记得敲钟。 3、蓝皮幽魂:蓝皮大头&#xff0…

间充质干细胞疗法迎来快速发展:国内新药申请超93项,全球临床试验超1300项

间充质干细胞(Mesenchymal Stem Cells, MSCs)独一无二的特性和机制构建了非凡的治疗前景和成药空间。截止到2024年10月18日,临床试验注册库clinicaltrials.gov网站上有关“Mesenchymal Stem Cell”的项目有1303项。在国家药品监督管理局药品审…

Active Directory(活动目录)密码审核工具

什么是Active Directory密码审核 Active Directory密码审核涉及监控用户密码的状态及其身份验证尝试,以便 IT 管理员收到有关弱 Active Directory密码或任何异常身份验证行为的通知。 Active Directory密码审核可帮助管理员评估用户密码的强度并采取必要措施来加强…

Composio:AI 开发利器,集成 100+ 工具,简化智能体构建

❤️ 如果你也关注大模型与 AI 的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的 AI 应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦! 微信公众号|搜一搜&…

SimpleLive 1.7.3 | TV+手机,聚合抖B虎鱼四大直播

SimpleLive是一款聚合多个直播平台的应用程序,内置虎牙、斗鱼、哔哩哔哩及抖音直播,提供无广告体验,支持弹幕显示调整、夜间模式切换等功能,无需登录即可关注不同平台主播并查看其直播状态。下载安装APK后打开应用,选择…

Web Service

目录 1、概览2、SOA架构2.1 Web Service的基础协议2.2 Web Service协议栈 3 Web Service的分类3.1 应用领域3.2 服务器类型 4 厂商支持4.1 Java EE4.2 .NET4.3 WebSphere 5 其他5.1 微服务与 Web Service5.1.1 微服务与 Web 服务之间的区别5.1.2 微服务、 Web 服务的最佳实践 5…

laravel 查询数据库

数据库准备 插入 三行 不同的数据 自行搭建 laravel 工程 参考 工程创建点击此处 laravel 配置 数据库信息 DB_CONNECTIONmysql #连接什么数据库 DB_HOST127.0.0.1 # 连接 哪个电脑的 ip (决定 电脑 本机) DB_PORT3306 # 端口 DB_DATABASEyanyu…

FloodFill 算法(DFS)

文章目录 FloodFill 算法(DFS)图像渲染岛屿数量岛屿的最大面积被围绕的区域太平洋大西洋水流问题扫雷游戏衣橱整理 FloodFill 算法(DFS) 漫水填充(Flood Fi)算法是一种图像处理算法,在计算机图形学和计算机视觉中被广泛…

超详细的 Stable Diffusion Webui入门教程(二)基础操作

前言 工欲善其事,必先利其器!今天我们聊聊 Stable Diffusion WebUI 的基础操作以及各个参数都代表了什么。 所有的AI设计工具,安装包、模型和插件,都已经整理好了,👇获取~ 一、大模型的切换 在 Stable D…

【从零开始的LeetCode-算法】3185. 构成整天的下标对数目 II

给你一个整数数组 hours&#xff0c;表示以 小时 为单位的时间&#xff0c;返回一个整数&#xff0c;表示满足 i < j 且 hours[i] hours[j] 构成 整天 的下标对 i, j 的数目。 整天 定义为时间持续时间是 24 小时的 整数倍 。 例如&#xff0c;1 天是 24 小时&#xff0c…

[Vue3核心语法] ref、reactive响应式数据

定义: ref用来定义&#xff1a;基本类型数据、对象类型数据&#xff1b; reactive用来定义&#xff1a;对象类型数据。 使用原则: 若需要一个基本类型的响应式数据&#xff0c;必须使用ref。 若需要一个响应式对象&#xff0c;层级不深&#xff0c;ref、reactive都可以。 …

项目管理这些问题,你是不是忍了很久?

项目管理中常见的问题&#xff0c;你是不是早就感到无奈了&#xff1f;项目进度滞后、成本超支、团队协作不畅、任务分配模糊、资源分配不合理……这些问题常常让人感到力不从心。 无论是关键节点的拖延&#xff0c;还是多部门间的沟通障碍&#xff0c;最终都会拖慢项目进展&a…

京东大模型革命电商搜推技术:挑战、实践与未来趋势

大模型对搜推技术产生了深远的影响&#xff0c;极大地推动了搜推技术的演进趋势&#xff0c;使得搜推更加的智能化和个性化&#xff0c;然而在搜推中引入大模型时同样面临一系列的挑战&#xff0c;例如商品知识的幻觉&#xff0c;复杂查询的理解&#xff0c;个性化商品推荐&…

酒店预订订房小程序源码系统 多酒店入驻+打造类似美团的酒店模式 带完整的安装代码包以及搭建部署教程

系统概述 随着移动互联网的普及&#xff0c;小程序因其轻量级、无需下载安装、即用即走的特点&#xff0c;迅速成为各行业的标配。对于酒店预订行业而言&#xff0c;小程序不仅能够有效提升用户体验&#xff0c;还能降低运营成本&#xff0c;提高转化率。本源码系统正是基于这…

js实现数组中数据有则删除无则添加-[‘12123‘,‘432233‘...]

可以使用indexOf方法来判断数组中是否存在某个元素&#xff0c;如果存在则使用splice方法删除该元素&#xff0c;如果不存在则使用push方法添加该元素。 下面是具体的代码实现&#xff1a; function addOrRemove(arr, item) {const index arr.indexOf(item);if (index -1) {…

Dockerfile和docker-compose详解

Dockerfile和docker-compose详解 文章目录 Dockerfile和docker-compose详解一、Dockerfile1. Dockerfile简介2. 构建镜像3. Dockerfile命令&#xff08;1&#xff09;FROM&#xff08;2&#xff09;WORKDIR&#xff08;3&#xff09;RUN&#xff08;4&#xff09;COPY&#xff…

MATLAB智能算法 - Immunity Algorithm免疫算法

Immunity Algorithm免疫算法 智能算法是路线规划、深度学习等等一系列领域所使用的优化算法&#xff0c;是算法进阶之路的必备之路。 前言&#xff1a;本文主要围绕解决TSP旅行商问题展开&#xff0c;对于机器人的路线规划以及非线性方程求解的问题等解决方案 对于一些其他智能…