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.hqwc.cn/news/705550.html

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

相关文章

【管理咨询宝藏104】普华永道财务管理与内控培训

本报告首发于公号“管理咨询宝藏”,如需阅读完整版报告内容,请查阅公号“管理咨询宝藏”。 【管理咨询宝藏104】普华永道财务管理与内控培训 【格式】PDF版本 【关键词】普华永道、四大、财务管理 【核心观点】 - 职能转变后,财务在决策支持…

亚马逊跨境电商平台优势凸显,武汉星起航解析助力卖家把握商机

在全球电商市场的激烈竞争中,亚马逊凭借其独特的优势和卓越的运营能力,成为众多卖家首选的跨境电商平台。武汉星起航作为深耕亚马逊跨境电商领域的领军企业,对亚马逊平台的优势有着深刻的理解和独到的见解。本文将重点探讨亚马逊跨境电商平台…

eMMC和SD模式速率介绍

概述 在实际项目开发中我们常见的问题是有人会问,“当前项目eMMC、SD所使用模式是什么? 速率是多少?”。这些和eMMC、SD的协议中要求的,要符合协议。接下来整理几张图来介绍。 eMMC 模式介绍 一般情况下我们项目中都是会支持到H…

基于SpringBoot设计模式之创建型设计模式·工厂方法模式

文章目录 介绍开始架构图样例一定义工厂定义具体工厂(上衣、下装)定义产品定义具体生产产品(上衣、下装) 测试样例 总结优点缺点与抽象工厂不同点 介绍 在 Factory Method模式中,父类决定实例的生成方式,但…

牛客NC404 最接近的K个元素【中等 二分查找+双指针 Java/Go/PHP】

题目 题目链接: https://www.nowcoder.com/practice/b4d7edc45759453e9bc8ab71f0888e0f 知识点 二分查找;找到第一个大于等于x的数的位置idx;然后从idx开始往两边扩展Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、…

UnitTest / pytest 框架

文章目录 一、UnitTest框架1. TestCase使用2. TestSuite 和 TestRunner3. TestLoader4. Fixture装置5. UnitTest断言1. 登录案例 6. 参数化1. parameterized插件 7. unitTest 跳过 二、pytest 框架1. 运行方式3.读取配置文件(常用方式) 2. pytest执行用例的顺序1. 分组执行(冒烟…

ArcGIS10.X入门实战视频教程(arcgis入门到精通)

点击学习: ArcGIS10.X入门实战视频教程(GIS思维)https://edu.csdn.net/course/detail/4046?utm_sourceblog2edu 点击学习: ArcGIS10.X入门实战视频教程(GIS思维)https://edu.csdn.net/course/detail/404…

【Python从入门到进阶】54、使用Python轻松操作SQLite数据库

一、引言 1、什么是SQLite SQLite的起源可以追溯到2000年,由D. Richard Hipp(理查德希普)所创建。作为一个独立的开发者,Hipp在寻找一个能够在嵌入式系统中使用的轻量级数据库时,发现现有的解决方案要么过于庞大&…

CAD插入文字到另一图形样式变相同

CAD从一张图形复制到另外一张图形后,文字样式变成一样是因为两张图所用的文字样式名称一样,但是样式里面的使用字体样式不一样。如下图所示,找到工具栏中的注释 ,点击文字样式。里面就会显示当前图形中使用的样式名称及其对应的字…

C++map容器关联式容器

Cmap 1. 关联式容器 vector、list、deque、forward_list(C11)等STL容器,其底层为线性序列的数据结构,里面存储的是元素本身,这样的容器被统称为序列式容器。而map、set是一种关联式容器,关联式容器也是用来存储数据的&#xff0…

【计算机毕业设计】springboot反诈科普平台的设计与实现

相比于以前的传统手工管理方式,智能化的管理方式可以大幅降低反诈科普平台的运营人员成本,实现了反诈科普平台的 标准化、制度化、程序化的管理,有效地防止了反诈科普平台的随意管理,提高了信息的处理速度和精确度,能够…

数据库审计系统Yearning使用笔记

一、启动 1、初始化MySQL 启动mysql docker run -d --namemysql -p 3306:3306 -e MYSQL_ROOT_PASSWORDroot mysql:5.7创建数据库,链接数据库并执行以下创建库的脚步,注意字符集 create database yearning char set utf8mb42、启动Yeelabs 需要执行…