当前位置: 首页 > news >正文

系列六、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

http://www.lryc.cn/news/234766.html

相关文章:

  • 技巧篇:在Pycharm中配置集成Git
  • Yolov5
  • 36、Flink 的 Formats 之Parquet 和 Orc Format
  • Docker 笔记(一)--安装
  • endnote20如何导入已经下载好的ris和pdf文件
  • x程无忧sign逆向分析
  • Rust8.1 Smart Pointers
  • MATLAB与Excel的数据交互
  • 使用.NET 4.0、3.5时,UnmanagedFunctionPointer导致堆栈溢出
  • jbase打印导出实现
  • 特征缩放和转换以及自定义Transformers(Machine Learning 研习之九)
  • 前端算法面试之堆排序-每日一练
  • C++之set/multise容器
  • 本地部署AutoGPT
  • ProtocolBuffers(protobuf)详解
  • HTTP 到 HTTPS 再到 HSTS 的转变
  • 清华学霸告诉你:如何自学人工智能?
  • Ubuntu 安装VMware Tools选项显示灰色,如何安装VMware Tools
  • SpringBoot 2.x 实战仿B站高性能后端项目
  • vscode文件夹折叠问题
  • 4-flask-cbv源码、Jinja2模板、请求响应、flask中的session、flask项目参考
  • 2.Pandas数据预处理
  • C# IEnumerable<T>介绍
  • 九洲
  • 基于Genio 700 (MT8390)芯片的AR智能眼镜方案
  • 锐捷OSPF认证
  • M2 Mac Xcode编译报错 ‘***.framework/‘ for architecture arm64
  • Python算法题2023 输出123456789到98765432中完全不包含2023的数有多少
  • SpringBoot整合Thymeleaf
  • OpenAI的多函数调用(Multiple Function Calling)简介