JVM学习-虚拟机栈

news2024/11/15 23:31:22

虚拟机栈

每个线程创建时都会创建一个虚拟机栈,其内部保存一个个栈帧,对应一次次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.coloradmin.cn/o/1679806.html

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

相关文章

【Linux】系统登录,调用shell,shell配置文件,shell命令,特殊符号,shell快捷键,Linux运行级别,解决无限登录问题,修改提示符

目录 Linux系统的登录方式 以及 调用shell Linux shell 以及 shell配置文件 shell 命令 shell 特殊符号 shell 快捷键 Linux操作系统运行级别 单用户模式下解决无限登录问题 centos7修改命令行提示符 PS1 补充、centos7没有滚动条 Linux系统的登录方式 以及 调用shell…

怎样让猫给啥吃啥?生骨肉冻干拌粮哪有猫咪不吃的!

随着科学养猫的普及,生骨肉冻干喂养越来越受欢迎,生骨肉冻干喂养对猫的好处很多,它符合猫咪的天性,可以提供全面的营养,保持牙齿和牙龈的健康,还有助于维持健康的消化系统。然而,许多猫主人在选…

构建智能化不动产管理系统:数字化引领未来房地产行业发展

随着城市化进程的不断推进和房地产市场的持续发展,不动产管理系统的重要性日益凸显。在这一背景下,构建智能化不动产管理系统成为推动房地产行业数字化转型的关键举措。本文将深入探讨智能化不动产管理系统的构建与优势,助力房地产企业把握数…

深入剖析Tomcat(八) 载入器与打破双亲委派机制的自定义类加载器

写这篇文章让我头大了好几天,书中描述的内容倒是不多,可能也是那会Tomcat的现状。如今Tomcat发展了好多代,加上springboot的广泛应用,导致现在的类加载的步骤和Tomcat资料中描述的大相径庭。可能也是由于微服务的发展,…

Linux 第三十四章

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…

五丰黎红引领新营销模式:布局一物一码数字化营销,提高调味品销量和复购率

调味品行业的销售渠道主要有餐饮、家庭消费和食品加工,按销售额的占比约为6:3:1,餐饮行业是调味品行业的供需主力。在餐饮行业中,“大厨”这一角色具有十分重要的地位。因此,借助大厨的力量成为了许多调味品…

HCIP【VLAN综合实验】

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

MT2057 门票

思路: 此题是求有多少个区间的平均值>t, 那么可以把每个值-t。如果新的数列的某个区间的和>0,那么说明这个区间满足条件。 令新数列的前缀和为b[i],所以求[i, j]区间是否满足条件,即求b[j]-b[i-1]是否>0&am…

基于SSM的婚恋网站的设计与实现(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的婚恋网站的设计与实现(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spri…

SpringBoot上传文件到服务器(跨服务器上传)

目录 (一)上传文件到本地(windows) (二)上传文件到linux服务器 (三)跨服务器上传文件 (一)上传文件到本地(windows) 1.新建一个文件…

程序员兼职引起的纠纷?

最近跟朋友聊天,说遇到一些因兼职工作而引发的争议,因为我本人也曾涉足过兼职领域,因此对程序员兼职时可能遇到的各种情况和应遵循的“套路”准则还有有一些发言权的,所以想和大家聊聊如何安全“兼职”的1/2事项~ ✅顺便内推个机会…

什么是用户画像?用户画像的作用是什么?

首先我们来说下什么是用户画像? 用户画像是指对目标用户进行详细描述和分类的方法。 它是根据用户的个人特征、行为习惯、兴趣爱好、消费习惯等信息进行分析和总结,以便更好地了解用户需求和行为模式。用户画像可以帮助企业或组织更好地了解他们的目标…

Nacos+GateWay 搭建微服务架构

文章目录 1.当前项目架构分析1.请求多个模块的方式1.请求renren-fast模块开发环境生产环境 2.请求sunliving-commodity模块1.使用环境变量资源路径的方式2.开发环境 dev.env.js3.生产环境 prod.env.js 3.文件上传请求 sunliving-service模块1.请求后端接口(开发环境…

对于接口的安全性测试,这几点你掌握了吗?

接口防刷 1.为什么会有人要刷接口? 牟利:黄牛在 12306 网上抢票再倒卖。 恶意攻击竞争对手:如短信接口被请求一次,会触发几分钱的运营商费用,当量级大了也很可观。 压测:用apache bench 做压力测试。 …

Wiley数据库文献哪里比较全?去哪里下载比较高效

Wiley出版社1807年创建于美国,是一家具有超过200年历史的全球知名的出版机构,面向专业人士、科研人员、教育工作者、学生、终身学习者提供必需的知识和服务。 Wiley及旗下的子品牌出版了超过500位诺贝尔奖得主的作品。Wiley Online Library为全学科期刊全…

std::remove-----std::remove_if

std::remove和std::remove_if 是 C11 标准库中的一个算法函数. std::remove 作用 遍历一遍容器,将容器中所有不是指定元素的元素往前复制。 总之就是一句话: 把不该删除的移动到前面,后面的就是应该删除的。 注意: 1&#…

postgreSQL安装配置

安装 在ubuntu界面执行 sudo apt install postgresql安装完成后,切换到postgres (安装过程中自动创建) sudo su - postgres#然后执行psql,进入数据库 psql创建数据库用户 在数据库中执行create命令创建用户,并带有…

C++调用有依赖库的python函数(VS2017+WIN10+Anaconda虚拟环境)

情况1.在写的函数中依赖了能够pip的库,例如numpy库、torch库,见下面的函数: import numpy as np import torch def add1(a, b):# 确保a和b都是NumPy数组a_array np.array(a) if not isinstance(a, np.ndarray) else ab_array np.array(b) if not isins…

波搜索算法(WSA)-2024年SCI新算法-公式原理详解与性能测评 Matlab代码免费获取

​ 声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 目录 原理简介 一、初始化阶段 二、全…

Android系统不同版本存储权限

一、Android存储简介 Android系统分为内部存储和外部存储 从Android6.0开始不断在更新存储(读写)权限,除了在AndroidManifest.xml文件里声明,app运行时也要动态申请使用对应的权限 提醒:应用私有存储不需要动态申请权…