JVM学习-虚拟机栈

虚拟机栈

每个线程创建时都会创建一个虚拟机栈,其内部保存一个个栈帧,对应一次次Java方法调用,栈是线程私有的。

生命周期:

与线程相同

作用

主管Java程序的运行,它保存方法的局部变量、部分结果、并参与方法的调用和返回。

特点
  • 栈是一种快速有效的分配存储方式,访问速度仅次于程序计数器。
  • JVM对Java栈有两个操作,入栈(每个方法执行)和出栈(程序执行结束)
  • 对于栈不存在垃圾回收问题
栈可能出现的异常

Java栈的大小是动态的或固定大小的

  • 如果采用固定大小的Java虚拟机栈,每一个线程的Java虚拟机栈容量线程创建的时候独立选定,如果线程请求分配的栈容量超过Java虚拟机栈允许的最大容量,Java虚拟机会抛出一个StackOverflowError异常
  • 如果Java虚拟机栈可以动态扩展,并在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那Java虚拟机会抛出OutOfMemoryError异常
设置栈内存大小参数 -Xss

详细见链接
在这里插入图片描述

存储单位

每个线程都有自己的栈,栈中的数据以栈帧(Stack Frame)格式存在,线程上正在执行的每个方法都各自对应一个栈帧,栈帧是一个内存区域,是一个数据集,维系着方法执行过程中的各种数据信息。

运行原理

栈帧

  • JVM对Java栈的操作只有两个,就是对栈帧压栈和出栈,遵循“先进后出”/“后进先出”原则
  • 在一条活动线程中,一个时间点上,只会有一个活动栈帧,即只有当前正在执行的方法的栈帧是有效的,这个栈帧被称为当前栈帧,与当前栈帧相对应的的方法是当前方法,定义这个方法的类为当前类
  • 执行引擎运行的所有字节码指令只针对当前栈帧进行操作
  • 如果该方法调用了其他方法,对应的新栈帧会被创建出来,放在栈的顶端,成为新的当前栈帧。
  • 不同线程中所包含的栈帧不允许相互引用,不可能在一个栈帧中引用另一个线程的栈帧
  • 如果当前方法调用了其他方法,方法返回时,当前栈帧会传回此方法的执行结果给当前一个栈帧,接着,虚拟机会丢弃当前栈帧,使前一个栈帧成为当前栈帧
  • Java方法有两种返回函数的方式,一种是正常函数返回,使用return指令,另一种是抛出异常,不管使用哪种方式,都会弹出栈帧
//栈帧测试
public class StackFramTest {public static void main(String[] args) {StackFramTest stackFramTest = new StackFramTest();stackFramTest.method1();}public void method1() {System.out.println("method1开始执行。。。");method2();System.out.println("method1结束执行。。。");}public int method2() {System.out.println("method2开始执行。。。");int i = 10;int m = (int) method3();System.out.println("method2结束执行。。。");return i + m;}public double method3() {System.out.println("method3开始执行。。。");double j = 20.0;System.out.println("method3结束执行。。。");return j;}
}
//执行结果
method1开始执行。。。
method2开始执行。。。
method3开始执行。。。
method3结束执行。。。
method2结束执行。。。
method1结束执行。。。
基于IDEA的调试工具查看栈帧的情况

在这里插入图片描述

栈帧内部结构
  • 局部变量表(Local Variables)
  • 操作数栈(Operand Stack)
  • 动态链接(Dynamic Linking)指向运行时常量池的方法引用
  • 方法返回地址(Return Address)
  • 一些附加信息
优、缺点

优点:跨平台,指令集小,编译器容易实现
缺点:性能下降,实现同样的功能需要更多指令

栈是运行时单位,堆是存储的单位,即栈解决程序运行问题,即程序如何运行,或者说如何处理数据,堆解决的是数据存储的问题,即数据怎么放,放在哪儿。

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

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

相关文章

PyTorch之list、ndarray、tensor数据类型相互转换

温故而知新,可以为师矣! 一、参考资料 python中list、numpy、torch.tensor之间的相互转换 二、常用操作 list 转 numpy ndarray np.array(list) import numpy as npa_list [[j for j in range(5)] for i in range(3)] a_ndarray np.array(a_lis…

云服务器配置mysql允许被远程连接从而使用图形化界面

介绍 在云服务器上搭建和配置数据库是进行网站和应用开发的关键步骤之一。本文将介绍如何在云服务器上设置 MySQL 8 和 MySQL 5,以允许远程连接,从而让你的数据库能够被远程用户访问。这样你的本机就可以访问linux服务器上的mysql能,就可以使…

254 基于matlab的钢筋混凝土非线性分析

基于matlab的钢筋混凝土非线性分析,根据梁本构关系,然后进行非线性分析,绘制弯矩-曲率曲线。可设置梁的截面尺寸、混凝土本构,钢筋截面面积等相关参数,程序已调通,可直接运行。 254 钢筋混凝土非线性分析 弯…

利用管道通信(pipe)测量进程间的上下文切换(context switch)开销

利用管道通信(pipe)测量进程间的上下文切换(context switch)开销 《https://pages.cs.wisc.edu/~remzi/OSTEP/cpu-mechanisms.pdf》 Measuring the cost of a context switch is a little trickier. The lmbench benchmark does so by running two processes on a single CPU…

qmake、CMake、make和Makefile

为了跟踪C工程的全部部分,要求有一种机制来精确地指定: 涉及的输入文件,如源代码文件:.cpp,头文件:.h建立程序时所需的工具,如编译器: g.exe,链接器:ld.exe&a…

哈夫曼编码的应用

数据结构与算法课的一个简单实验,记录一下,以供参考。 文章目录 要求测试样例统计字母出现次数建立哈夫曼树对字符编码对原文进行编码译码 要求 输入一段100—200字的英文短文,存入一文件a中。统计短文出现的字母个数n及每个字母的出现次数…

终于搞懂Linux 设备树中的#address-cells,#size-cells 和reg 属性

目录 一、前置知识 1. 处理器平台2. reg 属性的基本格式3. reg 属性的作用 reg 用法 二、#address-cells 和 #size-cells 属性 1. 示例1 2. 示例23. 示例3 一、前置知识 要理解#address-cells和#size-cell 这两个属性,就要先了解 reg属性。 1. 处理器平台 下…

VS2022如何添加现有项

以 想在队列里,使用堆栈的.c,.h文件 为例 目录 1.复制堆栈的.c,.h文件 ​编辑 2.打开队列所在项目的文件夹 3.粘贴堆栈的.c,.h文件 4.在头文件和源文件添加相应的堆栈的.c,.h文件 1.复制堆栈的.c,.h文件…

QML进阶(十七) ECMAScript 语法介绍

文章目录 基本语法变量基本类型类型转换对象函数和循环打印输出内置对象来自QML的基本类型ECMAScript语言的标准是由Netscape、Sun、微软、Borland等公司基于JavaScript和JScript定义出来的脚本语言标准。可以为不同种类的浏览器环境提供核心的脚本编程能力。在QML中我们通过EC…

HCIP【VLAN综合实验】

目录 一、实验拓扑图: 二、实验要求: 三、实验思路: 四、实验步骤: 1、在交换机SW1,SW2,SW3配置VLAN和各个接口对应类型的配置 2、在路由器上面配置DHCP服务 一、实验拓扑图: 二、实验要求: 1、PC1 …

STK12 RPO模块学习(3)

一、Maintain NMC RPO Sequence Maintain Natural Motion Circumnavigation RPO序列在目标星和追踪星经历不同的力的情况下保持NMC。通常这种差异是由于阻力和太阳光压造成的。这些是主要不同力当执行接近任务的时候,因为重力和相对三体摄动力非常小当相对距离在10…

【Docker使用技巧】

Docker使用 命令 //docker 进入容器内部 退出 exit docker exec -it 容器ID /bin/bash //docker 查看容器日志 退出 Ctrlc docker logs [OPTIONS] 容器ID或名称 [OPTIONS] -f : 跟踪日志输出 -t : 显示时间戳 --tail :仅列出最新N条容器日志 --since:显示某个日…

从零开始精通RTSP之传输AAC音频流

概述 AAC,英文全称为Advanced Audio Coding,是一种高效的有损音频压缩格式,由MPEG-4标准定义。相比传统的MP3,AAC在相同比特率下能提供更好的音质,尤其在低比特率场景下优势明显。AAC支持多种采样率、声道数和编码工具…

MySQL远程连接错误解决:“Host is not allowed to connect to this MySQL server”详解

目录 一、异常错误二、原因三、解决方法 一、异常错误 通过远程客户端访问MySQL服务器时会遇到“Host is not allowed to connect to this MySQL server”的错误提示。 二、原因 MySQL服务器当前配置不允许来自特定主机的连接尝试。 三、解决方法 允许远程主机访问MySQL服…

link.click()时浏览器报错The file at ‘data:image/png;base64,iVBORw

代码如下: const dataURL canvas.toDataURL({format: "png",width: 400,height: 400, });const link document.createElement("a"); link.download new Date().getTime();link.href dataURL; document.body.appendChild(link); link.click…

IT行业的现状与未来发展趋势

方向一:技术革新与行业应用 随着科技的日新月异,IT行业已成为全球经济增长和社会进步的重要引擎。从云计算、大数据、人工智能到物联网、5G通信和区块链,这些前沿技术正以前所未有的速度重塑我们的生活和工作方式。以下是我对IT行业现状及未来…

高压无源探头能测整流桥电压吗?

高压无源探头是用于测量高电压电路中信号的一种工具,它不需要外部电源供电。然而,对于测量整流桥电压,需要考虑几个因素以确定是否可以使用高压无源探头。 首先,让我们了解一下整流桥的基本原理。整流桥是一种电路,用…

MyBatis的一二级缓存区别

MyBatis的一级缓存和二级缓存之间存在以下主要区别: 缓存级别与作用域: 一级缓存:也称为SqlSession级别的缓存,与数据库会话(SqlSession对象)绑定,并且默认开启。一级缓存的作用域仅限于同一个…

STM32--HC-SR501 热释电人体红外感应模块

实物引脚图: 模块工作特性: 当人进入感应范围之后输出引脚输出高电平,人离开感应范围自动延时输出低电平 热释电效应: 热释电传感器,也称为人体红外传感器,其工作原理基于热释电效应。这种传感器由几个关…

Rust中使用Rocket框架返回html网页,返回一个基于 Handlebars (HBS) 模板的响应

在Rust中使用Rocket框架返回网页,通常涉及创建一个路由,该路由将返回一个HTML页面。Rocket是一个快速、易用且可扩展的Web框架,它允许你以一种简洁的方式定义路由和处理请求。 一、使用Rocket框架返回一个简单的HTML页面: 添加依…