栈的定义

栈也是一块区域,用来存放数据的。栈也叫栈内存,主管Java程序的运行。

栈是私有的,是在线程创建时创建,所以它的生命期是跟随线程的生命期,线程结束栈内存也就释放。

因此对于栈来说不存在垃圾回收问题,只要线程一结束该栈就Over,生命周期和线程一致。

这里把方法放进栈里,说的就是方法在栈帧里面。入栈出栈说的都是栈帧。

栈的特点

  • 栈空间也是不需要连续分配,只要在逻辑上相连即可。
  • 栈遵循最基本的栈的数据结构特征:先进后出。
  • 栈空间支付动态调整大小。-xms
  • 栈空间不会出现垃圾回收。(gc作用域不在该区域)
  • 栈的 5 栈的创建时机:在线程创建的时候,随之创建的。
  • 栈属于线程私有区域。
  • 对栈的操作,只有入栈出栈(压栈帧弹栈帧)

存储什么

栈中未来不是直接存放调用的方法,而是存储栈帧。栈帧是栈中最小单元。

8种基本类型的变量+对象的引用变量+returnAddress都是在函数的栈内存中分配。

栈帧中存储:前三个比较重要

  • 存储8种基本数据类型。
  • 存储对象的引用: user未来存储在栈帧中。
User user = new User();
  • 存输方法的返回地址(returnAddress)。
    • 任意一个万法都要存方法出去后的下一条指令地址,哪怕该方法是 void 类型也得存,因为任意的方法在底层字节码都会插入一条字节码指令return
public void a() {...b();...
}public void b() {......
}
  • 存储局部变量表(Local Variable)
  • 操作数栈。(Operate stack)
  • 动态链接(抽象)(Dynamic link)

如图,查看字节码指令多了return

举例

当一个方法A被调用时就产生了一个栈帧 F1,并被压入到栈中,

A方法又调用了 B方法,于是产生栈帧 F2 也被压入栈,

B方法又调用了 C方法,于是产生栈帧 F3 也被压入栈,

……

执行完毕后,先弹出F3栈帧,再弹出F2栈帧,再弹出F1栈帧……

遵循“先进后出”或者“后进先出”原则。

图示在一个栈中有两个栈帧:

栈帧 2是最先被调用的方法,先入栈,

然后方法 2 又调用了方法1,栈帧 1处于栈顶的位置,

栈帧 2 处于栈底,执行完毕后,依次弹出栈帧 1和栈帧 2,

线程结束,栈释放。

每执行一个方法都会产生一个栈帧,保存到栈(后进先出)的顶部,顶部栈就是当前的方法,该方法执行完毕后会自动将此栈帧出栈。

常见问题栈溢出:Exception in thread "main" java.lang.StackOverflowError

通常出现在递归调用时。

JVM对Java栈的操作只有两个,就是对栈帧的压栈和出栈,遵循“先进后出”或者“后进先出”原则。

一个线程中只能由一个正在执行的方法(当前方法),因此对应只会有一个活动的当前栈帧。

当一个方法1(main方法)被调用时就产生了一个栈帧1 并被压入到栈中,栈帧1位于栈底位置

方法1又调用了方法2,于是产生栈帧2 也被压入栈,

方法2又调用了方法3,于是产生栈帧3 也被压入栈,

…… 执行完毕后,先弹出栈帧4,再弹出栈帧3,再弹出栈帧2,再弹出栈帧1,线程结束,栈释放。

深入理解

通过在终端中输入这样的指令,可以去查看下面要讲的内容;或者idea中的jclasslib插件

javap -verbose 类名.class
局部变量表(Local Variables)

也叫本地变量表。 作用:存储方法参数和方法体内的局部变量:8种基本类型变量、对象引用(reference)。 可以用如下方式查看字节码中一个方法内定义的的局部变量,当程序运行时,这些局部变量会被加载到 局部变量表中。

实例方法第一个存的是this,方便去调用方法;而类方法直接可以利用类调用,所以就不需要存储。

局部变量表槽位,一个小方格是一个槽位。

long、double 这种类型是占了两个小方格

实例方法和形参也都会提前放好

  • 报错时,为什么能知道哪里错了?行号表;告诉说是哪一行报错了

操作数栈

作用: 也是一个栈在方法执行过程中根据字节码指令记录当前操作的数据,将它们入栈或出栈。用于保存计算过程的中间结果,同时作为计算过程中变量的临时存储空间。

  • 每一步指令都会严格的入栈出栈,想要深究可以去找pdf步骤。

动态连接

作用:通过符号引用动态确定某些对象。

比如可以知道当前帧执行的是哪个方法对象。程序在运行期间,通过运行时常量池中方法的符号引用,找到方法对象。

执行一个方法的流程:(待定了,先看上面解释即可)

找方法,先得找其类 A,而类在运行时常量池里,包括各种方法,各种属性(这里可能是哪个类在运行,其属性就在里面去找)。

拿到 A 在常量池中的符号 #1, 拿到了符号就可以去常量池拿到了类 A,编译就不会报错。

这是静态链接,只在编译的时候去找。

注意

操作数栈的深度和局部变量表的大小,是在编译阶段确定的。

栈空间溢出

Error Exception 平级,都是继承了 Throwable 类。

IDEA 中可以修改栈的大小,默认是 1MB。

这里是一直递归调用,使得一直使用方法redo导致栈空间爆炸。

// JVM设置  -Xss128k(默认1M)
public class StatckOverflowTest1 {private static int count = 0;public static  void  redo(){count++;redo();}public static void main(String[] args) {try {redo();} catch (Throwable e) {e.printStackTrace();System.out.println("counter====="+count);}}
}java.lang.StackOverflowError
at com.atguigu.jvm.StatckOverflowTest1.redo(StatckOverflowTest1.java:13)
at com.atguigu.jvm.StatckOverflowTest1.redo(StatckOverflowTest1.java:13)
at com.atguigu.jvm.StatckOverflowTest1.redo(StatckOverflowTest1.java:13)
at com.atguigu.jvm.StatckOverflowTest1.redo(StatckOverflowTest1.java:13)
at com.atguigu.jvm.StatckOverflowTest1.redo(StatckOverflowTest1.java:13)
at com.atguigu.jvm.StatckOverflowTest1.redo(StatckOverflowTest1.java:13)
at com.atguigu.jvm.StatckOverflowTest1.redo(StatckOverflowTest1.java:13)
at com.atguigu.jvm.StatckOverflowTest1.redo(StatckOverflowTest1.java:13)
counter=====10213

查看文档链接

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

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

相关文章

深度学习入门第一课——神经网络实现手写数字识别

昨天我们讲了深度学习的大致框架,下面我们用深度学习网络来实现一个小项目——手写数字识别。完整代码import torch from torch import nn from torch.utils.data import DataLoader from torchvision import datasets from torchvision.transforms import ToTensor…

Vue中的scoped属性

理解&#xff1a; 在 .vue 文件中&#xff0c;scoped 是 <style> 标签的一个属性&#xff0c;作用是让样式只作用于当前组件&#xff0c;避免样式污染其他组件 scoped 让样式只在自己的组件内生效&#xff0c;不会影响到其他组件的同名元素 举例 没有 scoped 的情况&…

S2B2B系统哪个好,商淘云、数商云、金蝶云苍穹供应链批发哪个比较靠谱

在数字化商业浪潮汹涌的当下&#xff0c;S2B2B系统已成为众多企业优化供应链、提升运营效率、拓展业务版图的关键利器。从大型企业的复杂产业链协同&#xff0c;到中小企业对上下游资源的整合与把控&#xff0c;S2B2B系统的身影无处不在。但面对市场上层出不穷的各类S2B2B系统&…

利用3台机器搭建Kubernetes集群

文章目录1 机器准备修改主机名(可选)配置IP地址和主机名映射关闭防火墙关闭swap2 安装docker修改并更新软件源安装docker设置路由转发规则&#xff0c;并使配置生效安装 kubelet&#xff0c;kubeadm&#xff0c;kubectl3 初始化集群4 集群初始化5 work节点加入6 部署网络插件本…

C6.3:发射结交流电阻

当一个小交流电压加在发射结上&#xff0c;会产生发射极交流电流&#xff0c;该交流电流的大小取决于Q点位置&#xff0c;而曲线是弯曲的&#xff0c;所以Q点在曲线上的位置越高&#xff0c;发射极交流电流的峰值越大。发射极总电流是直流分量和交流分量叠加而成&#xff0c;即…

python中生成器

生成器是根据算法生成数据的一种机制&#xff0c;每次调用生成器只生成一个值&#xff0c;可以节省大量内存生成器推导式gg ( i * 2 for i in range(5))print(gg)print(next(gg)) # 0 print(next(gg)) # 2 print(next(gg)) # 4 print(next(gg)) # 6 print(next(gg)) # 8yield…

【RAGFlow代码详解-28】部署和基础设施

Docker 部署架构 RAGFlow 使用多阶段 Docker 构建过程和 Docker Compose 编排进行部署。该系统支持完整和轻量级部署变体。 多阶段 Docker 构建构建过程由 Dockerfile 2-214中定义的三个阶段组成&#xff1a; 基础阶段 &#xff1a;使用系统依赖项、ML 模型和运行时环境设置 Ub…

【prism】Prism 弹窗在 ViewModel 中控制大小的实践总结

好 &#x1f44d; 这个思路非常适合写成一篇 实用型博客&#xff0c;主题就是 “Prism 弹窗如何在 ViewModel 中控制窗口大小”。我帮你整理了一篇文章草稿&#xff0c;你可以直接拿去修改/发布。Prism 弹窗在 ViewModel 中控制大小的实践总结 在 WPF 中使用 Prism 的 IDialogS…

项目管理进阶——研发项目立项管理制度

为使公司研究开发(以下简称研发)项目的管理工作规范化、程序化、充分调度研发人员的积极性,提高研发成果的产出率和成果转化率,特制定管理办法。 一、 研发项目的立项: 原则上公司部设立基础研究项目。研发项目的重点放在符合市场需要。能很快转化成产品,或对现有生产工…

CMake构建学习笔记20-iconv库的构建

1. 构建 iconv是一个用于在不同字符编码&#xff08;如 UTF-8、GBK、ISO-8859-1 等&#xff09;之间进行转换的开源库。笔者在《c中utf8字符串和gbk字符串的转换》这篇文章中介绍过如何在Windows下实现utf8字符串和gbk字符串的转换&#xff0c;不过该实现是基于Win32 API的&am…

STM32的Sg90舵机

1.舵机到底要的是什么信号&#xff1f;想象舵机就像一个“听秒表的工人”&#xff1a;这个工人每隔 20ms 就抬头看看秒表一次。秒表上的 高电平持续多久&#xff0c;他就把这个时间当成“指令角度”。高 1ms → 转到最左&#xff08;0&#xff09; 高 1.5ms → 转到中间&#x…

动态带宽扩展(DBE):下一代Wi-Fi性能提升的关键技术

动态带宽扩展(DBE):下一代Wi-Fi性能提升的关键技术 引言 在无线通信技术快速发展的今天,用户对网络带宽和传输速率的需求呈指数级增长。为了满足这种需求,IEEE 802.11标准不断演进,引入了多项创新技术。其中,动态带宽扩展(Dynamic Bandwidth Expansion, DBE) 作为80…

Seaborn数据可视化实战:Seaborn数据可视化基础-从内置数据集到外部数据集的应用

Seaborn数据集探索与图表绘制实践 学习目标 通过本课程&#xff0c;你将学习如何使用Seaborn库中的内置数据集&#xff0c;了解如何加载这些数据集&#xff0c;并掌握使用这些数据集绘制图表的基本方法。此外&#xff0c;你还将学习如何导入外部数据集&#xff0c;并在Seaborn中…

漫谈《数字图像处理》之经典空域边缘检测Canny与LOG

在《数字图像处理》的图像分割领域&#xff0c;Canny 边缘检测与 LOG&#xff08;高斯拉普拉斯&#xff09;边缘检测是两款极具代表性的先进空域算法。不同于深度学习驱动的方法&#xff0c;它们通过对图像像素的直接计算提取边缘&#xff0c;下面用更贴近日常认知的语言&#…

抢红包案例加强版

加join的功能是保证线程全部运行完毕&#xff0c;之后好统计构造器刚开始为空列表&#xff0c;利用这个方法返回每个成员列表&#xff08;把每个员工弄成一个列表里面写他们抢到的红包大小&#xff0c;索引代表抢到的个数。&#xff09;

曲面方程的三维可视化:从数学解析到Python实现

在三维几何建模中,我们经常遇到需要将隐式方程可视化的需求。本文将深入探讨一个特定的曲面方程: XH−YH2+ZH2tan⁡(θ)−H2πarcsin⁡(YHYH2+ZH2)=0 X_H - \frac{\sqrt{Y_H^2 + Z_H^2}}{\tan(\theta)} - \frac{H}{2\pi} \arcsin\left( \frac{Y_H}{\sqrt{Y_H^2 + Z_H^2}} \r…

当GitHub宕机时,我们如何协作

引言简述GitHub在全球开发协作中的重要性提出假设性问题&#xff1a;当GitHub不可用时&#xff0c;如何确保团队协作不中断常见的GitHub宕机场景服务完全不可用&#xff08;如DNS问题、全球性故障&#xff09;部分功能受限&#xff08;如API速率限制、仓库访问失败&#xff09;…

如何确定哪些层应添加适配器(Adapter)?(58)

“它如何确定哪些层应添加适配器(Adapter)?是否只有量化层符合条件?我能否也将适配器添加到常规(非量化)线性层上?” 这个问题提得很好,我会逐一为你解答。首先,先给出简洁结论: • 主流模型架构会预配置目标层列表,适配器将应用于这些列表中的层。 • 无论目标层…

【内网渗透】CVE-2025-21420 利用cleanmgr本地提权

目录 原理 POC 复现 一个windows本地提权漏洞 这是一个存在于Windows磁盘清理工具&#xff08;cleanmgr.exe&#xff09;中的权限提升漏洞。攻击者可以利用该系统组件在处理特定目录时的逻辑缺陷&#xff0c;通过精心构造的符号链接&#xff08;Symbolic Link&#xff09;&a…

什么是JSON-RPC 2.0,在项目中应该怎么使用

它是什么 JSON-RPC 2.0 是一种超轻量、与传输无关的远程调用协议&#xff1a;用 JSON 表达“方法名 参数 → 结果/错误”。可跑在 HTTP、WebSocket、Unix 管道&#xff0c;甚至 stdio 上&#xff08;很多开发协议如 LSP 就用它&#xff09;。 报文长这样 • 请求&#xff1a; …