【jvm】虚拟机栈

目录

        • 一、背景
        • 二、栈与堆
        • 三、声明周期
        • 四、作用
        • 五、特点(优点)
        • 六、可能出现的异常
        • 七、设置栈内存大小
        • 八、栈的存储单位
        • 九、栈运行原理
        • 十、栈帧的内部结构
          • 10.1 说明
          • 10.2 局部变量表
          • 10.3 操作数栈
          • 10.4 动态链接
          • 10.5 方法返回地址
          • 10.6 一些附加信息
        • 十一、代码示例
          • 11.1 StackOverflowError异常演示
          • 11.2 默认情况下深度
          • 11.3 栈大小改为-Xss256k的深度

一、背景
  • 1.由于跨平台的设计,java的指令是根据栈来设计的
  • 2.不同平台cpu架构不同,因此不能设计为基于寄存器的
  • 3.优点是跨平台,指令集小,编译器容易实现
  • 4.缺点是性能下降,实现同样的功能需要更多的指令
二、栈与堆
  • 1.栈是运行时的单位
  • 2.堆是存储的单位
  • 3.栈解决程序的运行问题,即程序如何执行,如何处理数据
  • 4.堆解决数据存储的问题,数据如何放,放在哪
  • 5.java虚拟机栈(java virtual machine stack),早期也叫java栈
  • 6.每个线程在创建时都会创建一个虚拟机栈,虚拟机栈内部保存一个个的栈帧(stack frame),对应java方法调用
  • 7.虚拟机栈是线程私有的
三、声明周期
  • 1.生命周期和线程一致
四、作用
  • 1.主管java程序的运行,保存方法的局部变量(8种基本数据类型、对象的引用地址)、部分结果,并参与方法的调用和返回
五、特点(优点)
  • 1.是一种快速有效的分配存储方式,访问速度仅次于程序计数器
  • 2.jvm直接对java栈的操作只有两个:a.每个方法执行,伴随着进栈(入栈、压栈)b.执行结束后的出栈工作
  • 3.对于栈来说不存在垃圾回收问题
六、可能出现的异常
  • 1.java虚拟机规范允许java栈的大小是动态的或者是固定不变的
  • 2.如果采用固定大小的java虚拟机栈,每一个线程的java虚拟机栈容量可以在线程创建的时候独立选定,如果线程请求分配的栈容量超过java虚拟机栈允许的最大容量,java虚拟机将会抛出一个StackOverflowError异常
  • 3.如果java虚拟机栈可以动态扩展,并且在尝试扩展时无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,java虚拟机栈会抛出一个OutOfMemoryError异常
七、设置栈内存大小
  • 1.可以使用参数-Xss选项来设置线程的最大栈空间
  • 2.栈大小直接决定了函数调用的最大可达深度
  • 3.单位有k(K)、m(M)、g(G)
  • 4.linux、macOS、oracle solaris默认1024KB(jdk11)
  • 5.windows:默认值取决于虚拟内存
  • 6.设置为1024KB有下列写法:-Xss1m、-Xss1024k、-Xss1048576
八、栈的存储单位
  • 1.每个线程都有各自的栈,栈中的数据是以栈帧(Stack Frame)的格式存在
  • 2.在这个线程上正在执行的每个方法都各自对应一个栈帧(Stack Frame)
  • 3.栈帧是一个内存区块,是一个数据集,维系方法执行过程中的各种数据信息
九、栈运行原理
  • 1.jvm直接对java栈的操作只有两个,即对栈帧的压栈和出栈,遵循先进后出、后进先出原则
  • 2.在一条活动线程中,一个时间点上,只会有一个活动的栈帧。即只有当前正在执行的方法的栈帧(栈顶栈帧)是有效的,这个栈帧被称为当前栈帧(Current Frame),与当前栈帧相对应的方法就是当前方法(Current Method),定义这个方法的类就是当前类(Current Class)
  • 3.执行引擎运行的所有字节码指令只针对当前栈帧进行操作
  • 4.如果在该方法调用了其他方法,对应的新的栈帧会被创建出来,放在栈的顶端,成为新的当前帧
  • 5.不同线程中所包含的栈帧是不允许存在相互引用的,即不可能在一个栈帧之中引用另外一个线程的栈帧
  • 6.如果当前方法调用了其它方法,方法返回之际,当前栈帧会传回此方法的执行结果给前一个栈帧,然后虚拟机会丢弃当前栈帧,使得前一个栈帧重新成为当前栈帧
  • 7.java方法有两种返回函数的方式,一种是正常的函数返回,使用return指令;另外一种是抛出异常(该异常未捕获处理,以抛出异常结束),不管使用哪种方式,都会导致栈帧被弹出
十、栈帧的内部结构
10.1 说明
  • 1.每个栈帧中存储着局部变量表(Local Variables)、操作数栈(或表达式栈)(Operand Stack)、动态链接(或指向运行时常量池的方法引用)(Dynamic Linking)、方法返回地址(或方法正常退出或异常退出的定义)(Return Address)、一些附加信息
10.2 局部变量表
  • 点我链接
10.3 操作数栈
  • 点我链接
10.4 动态链接
  • 点我链接
10.5 方法返回地址
  • 点我链接
10.6 一些附加信息
  • 1. 栈帧中还允许携带与Java虚拟机实现相关的一些附加信息。例如,对程序调试提供支持的信息
十一、代码示例
11.1 StackOverflowError异常演示
package com.learning.stack;/*** @Author wangyouhui* @Description StackOverflowError异常**/
public class StackOverflowErrorLearning {public static void main(String[] args) {main(args);}
}
11.2 默认情况下深度
package com.learning.stack;/*** @Author wangyouhui* @Description StackOverflowError异常**/
public class StackOverflowErrorLearning {private static int count = 1;public static void main(String[] args) {System.out.println(count);count ++;main(args);}
}

在这里插入图片描述

11.3 栈大小改为-Xss256k的深度

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

面试—如何介绍项目中的多级缓存?

项目中使用的多级缓存也就是 分布式缓存 Redis 本地缓存 Caffeine,那么令 Caffeine 作为一级缓存,Redis 作为二级缓存,在项目中通过记录数据的访问次数,将热点数据放在 本地缓存,将非热点数据放在 Redis缓存 中&#…

SMART PLC开放式以太网通信(UDP通信)

西门子S7-200 SMART PLC不仅支持开放式以太网通信,还支持MODBU-RTU,以及ModbusTcp通信,详细内容请参考下面文章: MODBUS-RTU主站通信 【精选】PLC MODBUS通信优化、提高通信效率避免权限冲突(程序+算法描述)-CSDN博客文章浏览阅读2.5k次,点赞5次,收藏10次。MODBUS通讯…

Glide transform CircleCrop()圆图,Kotlin

Glide transform CircleCrop()圆图,Kotlin import android.os.Bundle import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import com.bumptech.glide.load.resource.bitmap.CircleCropclass MainActivity : AppCompatActivity() {o…

在Windows或Mac上安装并运行LLAMA2

LLAMA2在不同系统上运行的结果 LLAMA2 在windows 上运行的结果 LLAMA2 在Mac上运行的结果 安装Llama2的不同方法 方法一: 编译 llama.cpp 克隆 llama.cpp git clone https://github.com/ggerganov/llama.cpp.git 通过conda 创建或者venv. 下面是通过conda 创建…

EXSi系统安装与使用

文章目录 EXSi系统安装与使用EXSi系统安装1.创建EXS虚拟机2.安装EXSi系统3.配置虚拟机 使用EXSi1.登录web页面2.扩充存储3.创建虚拟机4.使用虚拟机 EXSi系统安装与使用 EXSi系统安装 1.创建EXS虚拟机 创建虚拟机 2.安装EXSi系统 等待 回车 F11 回车 回车 设置密码&#xff…

并发编程: 2. 线程管控

给定一个线程,只要令std::thread对象与之关联,就能管控该线程的几乎每个细节。 2.1 线程的基本管控 2.1.1 发起线程 线程通过构建std::thread对象而启动,该对象指明线程要运行的任务(函数)。简单的任务,…

按键开发环境搭建

雷电模拟器 创建虚拟机 2.设置root权限 打开按键精灵连接虚拟机 开启悬浮 mumu模拟器操作 查找端口方法 adb connect 127.0.0.1:16416 设置-应用-所有应用-按键精灵-开启悬浮 步骤二:开启root 处理未root:中途如果有如下未root的情况&#x…

C#学习中关于Visual Studio中ctrl+D快捷键(快速复制当前行)失效的解决办法

1、进入VisualStudio主界面点击工具——>再点击选项 2、进入选项界面后点击环境——>再点击键盘,我们可用看到右边的界面的映射方案是VisualC#2005 3、 最后点击下拉框,选择默认值,点击之后确定即可恢复ctrlD的快捷键功能 4、此时可以正…

蓝鹏测控测宽仪系列又添一员大将——双目测宽仪

轧钢过程中钢板的宽度是一个重要的参数,它直接决定了成材率。同时,随着高新科技越来越广泛的应用到工程实际中,许多控制系统需要钢板实时宽度值作为模型参数。 当前,相当一部分宽厚板厂还在采用人工检测的方法,检测环境…

Gin学习笔记

Gin学习笔记 Gin文档:https://pkg.go.dev/github.com/gin-gonic/gin 1、快速入门 1.1、安装Gin go get -u github.com/gin-gonic/gin1.2、main.go package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {// 创建路由引…

python学习10

前言:相信看到这篇文章的小伙伴都或多或少有一些编程基础,懂得一些linux的基本命令了吧,本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python:一种编程语言&…

Redis的持久化机制

多级缓存使用到了一个装饰设计模式:相当于我不影响我之前缓存本身的代码,但是我可以对我的缓存去做增强,因此多级缓存就是采用装饰模式去实现的~! 多级缓存可以采用装饰模式去重构~! Redis当中的持久化机制&#xff…

【图】:常用图搜索(图遍历)算法

目录 概念图遍历深度优先搜索 (DFS)DFS 适用场景DFS 优缺点 广度优先搜索 (BFS)BFS 适用场景BFS 优缺点 DFS & BFS 异同点 图搜索Dijkstra算法A*算法Floyd算法Bellman-Ford算法SPFA算法 概念 图遍历和图搜索是解决图论问题时常用的两种基本操作。 图遍历是指从图中的某一个…

挑战100天 AI In LeetCode Day01(2)

挑战100天 AI In LeetCode Day01(2) 一、LeetCode介绍二、LeetCode 热题 HOT 100-22.1 题目2.2 题解 三、面试经典 150 题-23.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站,提供各种算法和数据结构的题目,面向程序…

基于nodejs+vue贝佳月子会所服务平台系统- 计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

ESP32S3入手体验测试

ESP32S3入手体验测试 🔖所入手的型号是YD-ESP32-S3 N16R8,该款和乐鑫官方推出的ESP32-S3-DevKitC-1配置差不多。 🎈乐鑫官方介绍:ESP32-S3-DevKitC-1 v1.1 🔰两者采用的模组:ESP32-S3-WROOM-1 和ESP32-S3-WROOM-1U模组…

Maven修改仓库和镜像地址

目录 1、修改仓库地址2、修改镜像地址 1、修改仓库地址 使用IDEA时,如果不指定自己下载的Maven,idea会默认使用自带的Maven 3(bundle)。maven 3默认的仓库路径一般是在c盘的用户文件夹中的.m2目录下: 当maven下的pom文件中的依赖逐渐增加时,maven仓库下…

云安全—kubelet攻击面

0x00 前言 虽然说总结的是kubelet的攻击面,但是在总结攻击面之前还是需要去了解kubelet的基本原理,虽然说我们浅尝即止,但是还是要以能给别人讲出来为基本原则。 其他文章: 云安全—K8s APi Server 6443 攻击面云安全—K8S API Server 未授…

基于ASP.NET MVC + Bootstrap的仓库管理系统

基于ASP.NET MVC Bootstrap的仓库管理系统。源码亲测可用,含有简单的说明文档。 适合单仓库,基本的仓库入库管理,出库管理,盘点,报损,移库,库位等管理,有着可视化图表。 系统采用Bo…

懒汉模式和饿汉模式

目录 单例模式 饿汉模式 懒汉模式 单例模式 所谓单例模式,就是在有些场景中,有些特定的类,只能创建一个实例(对象),当程序员不小心创建多个实例,就会出现编译报错. ★ 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创…