【JVM第5课】虚拟机栈

news/2025/1/17 3:00:31/文章来源:https://www.cnblogs.com/GilbertDu/p/18517026

Java虚拟机栈(Java Virtual Machine Stack,简称JVM栈,又称Java方法栈)是 JVM 运行时数据区的一部分,主要用于支持Java方法的执行。每当一个新线程被创建时,JVM就会为这个线程分配一个私有的方法栈,线程执行过程中每个方法调用都会创建一个新的栈帧(Stack Frame),而这些栈帧会被组织成后进先出的栈结构。

1 栈知识点

  1. 线程私有

    • 每个线程都有自己的虚拟机栈,与其他线程的栈完全隔离。
    • 线程私有的特性确保了多线程环境下的数据安全和并发执行的效率。
  2. 生命周期与线程相同

    • 虚拟机栈的生命周期与线程的生命周期相同。当线程创建时,虚拟机栈也随之创建;当线程结束时,虚拟机栈也随之销毁。所以虚拟机栈不需要进行垃圾回收
  3. 栈深度

    • 如果方法调用层次过深或者循环调用导致栈帧数量过多,可能会发生栈溢出错误StackOverflowError。但如果线程太多,线程创建时没有足够的内存去创建虚拟机栈,则会抛出OutOfMemoryError错误。
    • 虚拟机栈的深度是可以配置的,通常通过JVM启动参数 -Xss 来设置每个线程的栈大小。合理配置栈深度可以避免栈溢出和内存不足的问题。
  4. 栈帧(Stack Frame)

    • 每个方法调用都会创建一个新的栈帧,并将其压入当前线程的虚拟机栈顶。
    • 当方法执行完毕后,对应的栈帧会被弹出并丢弃。
    • 栈帧是方法执行的基本单位,包含局部变量表、操作数栈、动态链接、方法出口信息等。

2 栈帧

每个栈帧包含了以下部分:

  1. 局部变量表:用于存放方法参数和方法内部定义的局部变量。局部变量表以变量槽(Variable Slot)的形式存在,每个槽可以存放一个基本数据类型、返回地址或者对象引用。对于64位的数据类型(如long和double),需要占用两个连续的槽位。
  2. 操作数栈:顾名思义,就是用来暂存要操作的数据和操作结果的地方。当执行字节码指令时,会从局部变量表或常量池中加载数据到操作数栈,然后根据指令完成相应的计算或操作,最后将结果存回操作数栈或局部变量表。
  3. 动态链接:包括对常量池的引用和对上层方法栈帧的引用,用于支持方法调用过程中的动态链接。
  4. 方法出口信息:包含正常完成出口和异常完成出口的信息,用于处理方法执行完毕后的返回值传递和异常抛出。

当一个方法被调用时,JVM会执行如下步骤:

  1. 创建栈帧:为被调用的方法创建一个新的栈帧,并将其压入当前线程的方法栈顶。
  2. 初始化栈帧:将方法参数传递到新的栈帧的局部变量表中,同时清空操作数栈。
  3. 执行字节码指令:根据方法体中的字节码指令,进行相应的计算和逻辑处理。
  4. 清理栈帧:当方法执行完毕后(无论是正常结束还是异常终止),将结果(如果有)返回给上一层方法,然后从方法栈中弹出当前栈帧。

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

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

相关文章

优化百万数据大量查询

百万数据分页查询接口,如何保证接口的性能?这就需要对该分页查询接口做优化了。这篇文章从9个方面跟大家一起聊聊分页查询接口优化的一些小技巧 1 增加默认条件 对于分页查询接口,如果没有特殊要求,我们可以在输入参数中,给一些默认值。这样可以缩小数据范围,避免每次都…

Scrum中文网研发的工具叫什么

Scrum中文网研发的工具叫做”敏捷猫”,这是一个基于Scrum理念和敏捷开发方法论所设计的项目管理工具,致力于帮助团队更好地实施敏捷开发,提高工作效率和产品质量。敏捷猫提供了全面的项目管理功能,包括任务创建、分配、跟踪和评估等,使项目管理变得更为简单和直观。Scrum中…

hyper-v虚拟机使用教程

原文链接: https://mp.weixin.qq.com/s/zNubQcNOePB7Y4AWfou0Yg 前言 从前几年开始,我平时使用的虚拟机就换成了hyper-v,当然PVE也会使用(作为服务器挂机用,后面出个文章说下),VMware是完全抛弃不用了。 至于为什么不用VMware,好像也没啥理由,就感觉hyper-v使用更顺手一点…

工作炒股两不误!这款 IDEA 插件帮助你关注股票基金!

leeks —— 一款 IDEA 插件,支持在 IDEA 中查看股票(A股,港股,美股)、基金、加密货币!大家好,我是 Java陈序员。 之前给大家安利过一款 VS Code 插件来实时查看股票&基金! 韭菜盒子!VSCode 也可以看股票&基金了! 今天,给大家介绍一款同款的 IDEA 插件,在写…

项目进度计划中的任务如何优先排序

项目进度计划中的任务优先排序取决于多个因素:任务的紧迫性、依赖关系、资源可用性、项目关键路径以及潜在风险。通常,在确定任务优先级时,应首先考虑关键路径上的任务,因为这些任务直接影响项目完成的总时长。接着,考虑那些有着严格截止日期或是对项目成败至关重要的任务…

PbootCMS后台ueditor编辑器上传图片如何去掉自动添加的title和alt属性

修改 ueditor.all.min.js 文件:打开 \core\extend\ueditor\ueditor.all.min.js 文件 搜索 "imageUrlPrefix",找到以下代码:javascriptg.setAttribute("title", f.title || ""); g.setAttribute("alt", f.original || "")…

『玩转Streamlit』--页面布局

一个优秀的数据应用不仅仅是功能的强大,更在于其用户体验的打造。 而良好的页面布局,作为用户体验的重要组成部分,不仅能够提升信息的可读性,还能引导用户高效地完成操作。 反之,混乱的布局会让人感到困惑和挫败,甚至导致用户放弃使用应用。 在Streamlit中,Sidebar(侧边…

# 20222322 2024-2025-1 《网络与系统攻防技术》实验三实验报告

1.实验内容 1.1实验内容 (1) 使用msfvenom和msf编码器生成文件使用msfvenom生成exe文件,并进行编码。 生成jar文件,用于Java环境下的攻击。 生成PHP文件,用于Web服务器上的攻击。(2) 使用Veil工具生成恶意代码下载并安装Veil-Evasion,使用Veil生成恶意代码。(3) 使用C+shel…

高级程序语言课程第五次作业

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/2024C/ 这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/2024C/homework/13298 姓名:刘嘉奕 学号:102400204停止输入进行运算用ctrl+z打印\n用\n8.5语句循环逻辑错误8.7用字符代替数字选项,用q代替5结束…

SQL Server创建用户只能访问指定数据库和视图

我们在给数据库用户赋予权限时,有时候不想让该用户看到太多过程表和过程视图,这时就需要限定用户的访问权限 第一步:创建用户 创建数据库连接后,进入安全性——登录名,单击右键,新建登录名,并设置默认数据库第二步:设置用户映射 点击用户映射,勾选指定要访问的数据库,…

更安全高效的文件传输工具,Ftrans国产FTP替代方案可以了解!

文件传输协议(FTP),诞生于1971年,自20世纪70年代发明以来,FTP已成为传输大文件的不二之选。内置有操作系统的 FTP 可提供一个相对简便、看似免费的文件交换方法,因此得到广泛使用。 随着企业发展过程中新增的文件传输需求,FTP的局限性开始凸显,企业都在寻求国产FTP替代…