系列六、JVM的内存结构【栈】

一、产生背景

由于跨平台性的设计,Java的指令都是根据栈来设计的,不同平台的CPU架构不同,所以不能设计为基于寄存器的。

二、概述

        栈也叫栈内存,主管Java程序的运行,是在线程创建时创建,线程销毁时销毁,它的生命周期是跟随线程的生命周期,线程结束,栈内存也就释放,对于栈来说不存在垃圾回收,只要线程一结束该栈就over,生命周期和线程一致,是线程私有的。8种基本类型的变量+对象的引用变量+实例方法都是在函数的栈内存中分配

三、特点

(1)栈是一种快速有效的分配存储方式,访问速度仅次于程序计数器;

(2)JVM直接对Java栈的操作只有2个,即:

        a、每个方法执行,伴随着进栈、出栈操作;

        b、方法结束后,执行出栈操作;

(3)对于栈来说,不存在垃圾回收工作;

四、栈中存什么

8中基本数据类型 + 对象的引用变量 + 实例方法。
byte、short、int、long、float、double、boolean、char

五、栈帧中存什么

栈中主要保存3种数据,即:

        本地变量(Local Variables):输入参数和输出参数,以及方法内的变量;

        栈操作(Operand Stack):记录出栈、入栈的操作;

        栈帧数据(Frame Data):包括类文件、方法等

备注:java中的方法进入虚拟机后叫做栈帧。

六、栈的运行原理

         栈中的数据都是以栈帧(Stack Frame)的格式存在,栈帧是一个内存区块,是一个数据集,是一个有关方法(Method)和运行期数据的数据集,当一个方法A被调用时就产生了一个栈帧 F1,并被压入到栈中,A方法又调用了 B方法,于是产生栈帧 F2 也被压入栈,B方法又调用了 C方法,于是产生栈帧 F3 也被压入栈,……执行完毕后,先弹出F3栈帧,再弹出F2栈帧,再弹出F1栈帧……遵循“先进后出”/“后进先出”原则。每个方法执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息,每一个方法从调用直至执行完毕的过程,就对应着一个栈帧在虚拟机中入栈到出栈的过程。栈的大小和具体JVM的实现有关,通常在256K~756K之间,约等于1MB左右。

七、栈中常见的异常 & 如何设置栈大小

7.1、概述

        Java虚拟机规范允许Java栈的大小是动态的或者固定不变;

        如果采用固定大小的Java虚拟机栈,那每一个线程的Java虚拟机栈容量可以在线程创建时独立选定,如果线程请求分配的栈容量超过Java虚拟机栈允许的最大容量,将会抛出异常

StackOverflowError异常;

        如果Java虚拟机栈可以动态扩展,并且在尝试扩展时无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那么Java虚拟机将抛出异常

OutOfMemoryError异常(是一个错误);

7.2、默认情况下栈的大小

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/16 18:55
 * @Description: 默认情况下栈的大小
 */
public class StackMainApp {

    private int stackLength = 1;

    public void stackLeak() {
        stackLength++;
        stackLeak();
    }

    public static void main(String[] args) {
        StackMainApp stackMainApp = new StackMainApp();
        try {
            stackMainApp.stackLeak();
        } catch (Throwable e) {
            System.out.println("stackLength = " + stackMainApp.stackLength);
            e.printStackTrace();
        }
    }

}

7.3、修改栈的大小

-Xss128k

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

48v变12v同步转换芯片

48v变12v同步转换芯片 以下是一篇关于48V变12V同步转换器WD5105ic的文章正文:48V变12V同步转换器WD5105ic是一种电源管理芯片,它可以将48V的直流电压转换为12V的直流电压。这款芯片具有广泛的应用范围,包括车载充电器件、电动车仪表器件、电…

系列二、什么是OOM?什么是StackOverflowError?有哪些方法分析?

一、什么是OOM? OOM是堆内存溢出,产生的原因是堆的空间大小是有限的,当堆空间的大小不足以满足创建对象所需要的内存空间时,就会抛出OOM的异常。 二、什么是StackOverflowError? StackOverflowError是栈内存溢出的意思…

C++核心编程 day09 类型转换、异常、输入输出流

C核心编程 day09 类型转换、异常、输入输出流 1. 类型转换2. 异常2.1 异常语法2.2 C标准异常库 3. 输入输出流3.1 输入输出流概念以及流类库3.2 标准输入流3.3 标准输出流3.4 文件读写 1. 类型转换 C中的类型转换有四类,分别是静态转换、动态转换、常量转换、重新解…

STM32 ADC介绍和应用

目录 1.ADC是什么? 2.ADC的性能指标 3.ADC特性 4.ADC通道 5.ADC转换顺序 6.ADC触发方式 7.ADC转化时间 8.ADC转化模式 扫描模式 单次转换/连续转换 9.ADC实验 使用ADC读取烟雾传感器的值 代码实现思路: 核心代码示例: 1.ADC是什…

算法---相等行列对

题目 给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid ,返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目。 如果行和列以相同的顺序包含相同的元素(即相等的数组),则认为二者是相等的。 示例 1: 输入&…

Windows10电脑没有微软商店的解决方法

在Windows10电脑中用户可以打开微软商店,下载自己需要的应用程序。但是,有用户反映自己Windows10电脑上没有微软商店,但是不清楚具体的解决方法,接下来小编给大家详细介绍关于解决Windows10电脑内微软商店不见了的方法&#xff0c…

01Urllib

1.什么是互联网爬虫? 如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的数据 解释1:通过一个程序,根据Url(http://www.…

linux清理僵尸进程

当你top看到这个,或者按M后看到内存吃的很多,那你看下有没有🧟 二选一查看是什么进程 ps aux | egrep "Z|defunct" ps -aux | awk {if($8"Z"){print $2,$11}}没用直接杀杀杀 kill -9 查到的PID号可中断下载文件 wget…

【Linux网络】工作环境救急——关于yum安装的5个花式操作

目录 1、只下载不安装,离线安装软件 2、自行打包创建元数据 第一步:先准备好nginx的软件包,放在一个文件夹下 第二步:在本地下载createrepo命令软件,用于创建元信息,这个一定是对包的上一级目录使用命令…

【整顿C盘】pycharm、chrome等软件,缓存移动

C盘爆了,特来找一下巨大的软件缓存,特此记录,跟随的各大教程,和自己的体会 一、爆炸家族JetBrains 这个适用于pycharm、idea、webstorm等等,只要是JetBrains家的,2020版本以上,都是一样的方法 p…

python内置模块subprocess 模块,创建和管理子进程

一、简介 subprocess 是 Python 标准库中的一个模块,用于创建和管理子进程。它提供了一种在 Python 程序中启动新进程、连接到它们的输入/输出/错误管道以及获取它们的返回值的方法。 使用 subprocess 模块,你可以在 Python 程序中执行外部命令、调用其…

Linux_/proc目录_查看处理器的信息/proc/cpuinfo

1、cat /proc/cpuinfo_查看/proc/cpuinfo文件的内容 可以看到板卡有4个处理器,剩下的信息emmm...... 2、BogoMIPS_反映CPU运算速率 MIPS是millions of instructions per second(百万条指令每秒)的缩写,其代表CPU的运算速率。 BogoMIPS是Linux大致计算…

Python开源项目GPEN——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践

无论是自己、家人或是朋友、客户的照片,免不了有些是黑白的、被污损的、模糊的,总想着修复一下。作为一个程序员 或者 程序员的家属,当然都有责任满足他们的需求、实现他们的想法。除了这个,学习了本文的成果,或许你还…

springcloud失物招领网站源码

开发技术: jdk1.8,mysql5.7,idea,nodejs,vscode springcloud springboot mybatis vue elementui 功能介绍: 用户端: 登录注册 首页显示搜索失物,轮播图,最新发布的…

OpenCV快速入门:基本操作

文章目录 1. 像素操作1.1 像素统计1.2 两个图像之间的操作1.2.1 图像加法操作1.2.3 图像加权混合 1.3 二值化1.4 LUT(查找表)1.4.1 查找表原理1.4.2 代码演示 2 图像变换2.1 旋转操作2.1.1 旋转的基本原理2.1.2 代码实现 2.2 缩放操作2.3 平移操作2.3.1 …

基于SSM的宠物综合服务平台的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

Topaz Video AI:引领视频质量革命,让您的内容焕发新生

随着数字媒体的日益普及,视频质量的重要性日益凸显。无论是个人用户还是专业团队,都需要确保他们的视频内容具有最佳的质量。但是,由于各种原因,如设备限制、环境干扰等,往往导致视频质量不尽如人意。这时,…

【ISP图像处理】Demosaic去马赛克概念介绍以及相关方法整理

1. 基本定义 使用彩色滤光器阵列(CFA)的数码相机需要一个去马赛克程序来形成完整的RGB图像。一般的相机传感器都是采用彩色滤光片阵列(CFA)放置在光感测单元上,在每个像素处仅捕获三种原色成分中的一种。 去马赛克方法主要关注于复原非常规区域,比如边缘…

mybatis之主键返回

1.在mybatis的xml中加入 <insert id"insertUser" keyProperty"id" useGeneratedKeys"true" parameterType"com.UserAndOrder"> insert into Tuser(userName,passWord) values (#{userName},#{passWord} ) </insert&…

内存管理中的一级指针和二级指针

目录 写在前面指针和内存管理正常使用类型转换中的使用分割内存块建立链接 新知识收获(void *)0和null(void*&#xff09;和 * 写在前面 关于指针的内容&#xff0c;在本科的时候有学过&#xff0c;但是仅限于学过&#xff0c;使用起来那是跟没学过一样&#xff0c;最近读操作…