JVM 虚拟机栈详解
当Java虚拟机运行程序时。每当一个新的线程被创建时。Java 虚拟机都会分配一个虚拟机栈,Java虚拟机栈是以帧为单位来保存线程的运行状态。Java栈只会有两种操作:以帧为单位进行压栈跟出栈。
某个线程正在执行的方法称为当前方法,以此类推出当前类,当前常量池(每一个方法都有自己唯一的常量池)
每当线程调用当前方法时,都会将,新栈压入,成为当前帧。jvm会使用它来存储我们的形参,局部变量,中间运行结果等。
执行结束返回的方式会有两种,一种是 retuen正常返回,另外一种是通过异常来返回。无论哪种方式虚拟机都会释放弹出当前帧。这样上一个方法就成为了当前帧
之前我们提过Java栈中的数据都是线程私有的,因此线程都不能访问另一个线程的数据。因此我们在此无需考虑多线程。
栈帧
栈帧由,局部变量表,操作数栈,帧数据区组成。
class Examplea3a{
public static int runClassMethod(int i,long l,float f,double d,Object o, byte b){return 1;};public int runInstanceMethod(char c,double d,short s,boolean b){return 0;};
}
上图描述了 Examplea3a 类中两个方法的局部变量区, 值得俺们注意的是在runInstanceMethod方法中,索引为0的参数是一个引用类型的reference,尽管方法中没有显示的声明这个参数,但这个this是任何一个实例方法都存在的,而类方法中就没有这个this变量,类方法只与类的声明中欧琪相关,无法关联到一个具体的实例。
操作数栈 与局部方法区一样,也是一个数组,不同的是操作数栈不是通过索引来访问的。而是通过标准的栈操作:进栈–出栈来操作来访问的。
虚拟机把操作数栈作为工作空间,执行运算,最后把结果再次压入到操作数栈中。
iload_0 // push the int local variable 0iload_1 // push the int local variable 1iadd // pop two ints, add them, push resultsistore_2 // pop two ints ,store into local variable
在这个字节码序列中,iload_0 , iload_1 将存储在局部变量表中索引为0,1的数压入到操作数栈中,之后执行iadd,再将结果压入到操作数栈。第四条指令则从操作数栈弹出,并将其存储到局部变量表中索引为2的位置。如下图
除了以上局部变量跟操作数栈以外,Java栈还需要一些数据来支持我们常量池的解析,方法返回,以及异常派发机制。这些新信息都存储在帧数据区。当虚拟机执行某个命令时,需要常量池的数据池的指令。就会通过帧数据区指向常量池的指针来访问他,常量池中对类型,字段,方法的入口起始时都是符号一用,当虚拟机要在常量池中进行搜索时,如果指导类,接口,或方法的入口。若他么恩还是符号类型,虚拟机才会进行解析。Java栈可能的实现方式(一):
class A(){private static void addAndPrint(){double result = addTwoTypes(1,55.55)}
private static double addTwoTypes(int i ,double d){return i+d; }
}
当执行addAndPrint()方法,为了调用addTwoTypes(),addAndPrint()首先将 1,55.55压入到自己的操作数栈堆中。然后调用addTwoTypes(),进行常量池解析
注意addAndPrint()调用addTwoTypes()方法的时候也是需要解析常量池才可以使用该方法的。尽管他俩属于一个类。但类中的方法,字段初始也是符号引用,使用之前也要解析。
解析后的常量池将解析后的数据指向addTwoTypes(),虚拟机将根据这些信息来决定局部变量,和操作数栈的数据区的大小。虚拟机在堆中分配好足够的内存后,ddAndPrint()弹出他的栈帧,再将1,55.55压入到addTwoTypes()的局部变量表0,1索引的位置,在通过栈操作数操作完,返回后找到addAndPrint()调用方释放,最够把ddTwoTypes()作为当前帧,继续执行addAndPrint()。
Java栈可能的实现方式(二):
另外一种栈的实现方式是将栈操作数和局部变量表存储在连续的虚拟机栈中,
(栈是向下生长的)
addTwoTypes()与 addAndPrint()方法的额栈帧区是连续的,在调用addTwoTypes()方法时。我们将addAndPrint()操作数栈数据区,作为addTwoTypes()局部变量空间。这样贼省空间,又省时间!
JVM 虚拟机栈详解相关推荐
- 【JVM】运行时数据区介绍,程序计数器和虚拟机栈详解
JVM越来越是Java面试中的重头戏,今天来总结一下JVM运行时数据区的相关内容. 文章目录 JVM运行时数据区 JVM运行时数据区内部结构 程序计数器(PC寄存器) 程序计数器的介绍 PC寄存器的实 ...
- JVM 虚拟机图文详解!真香!秒懂!一点都不难!
前言: 了解Java中的对象.变量等存放的内存区域十分重要 本文将全面讲解Java虚拟机中的内存模型 & 分区,希望你们会喜欢 目录: 1. 内存模型 & 分区 Java虚拟机在运行J ...
- Java虚拟机栈详解
前言 虚拟机栈也称为Java栈,每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame) 栈特点基本介绍 Java虚拟机栈属于线程私有,它的生命周期与线程相同(随线程而生,随 ...
- [java] 虚拟机(JVM)底层结构详解[转]
[java] 虚拟机(JVM)底层结构详解[转] 本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 在以前的博客里面,我们介绍了在java领 ...
- JVM 启动参数详解
JVM 启动参数详解 JVM 作为一个通用的虚拟机,我们可以通过启动Java命令时指定不同JVM参数,让 JVM调整自己的运行状态和行为,内存管理和垃圾回收的GC算法等等. 直接通过命令行启动 Jav ...
- 【JAVA进阶】JVM第二篇- JVM 垃圾回收详解
写在前面的话 脑子是个好东西,可惜的是一直没有搞懂脑子的内存删除机制是什么,所以啊,入行多年,零零散散的文章看了无数,却总是学习了很多也忘了很多. 痛定思痛的我决定从今天开始系统的梳理下知识架构,记录 ...
- JDK自带JVM分析工具详解
JDK自带JVM分析工具详解 1. JVM分析工具概述 1.1 JVM分析工具简介 1.2 JVM分析工具分类 2. JVM分析工具详解 2.1 idea环境配置 2.2 jps 2.3 jinfo ...
- ceph存储原理_赠书 | Linux 开源存储全栈详解——从Ceph到容器存储
// 留言点赞赠书我有书,你有故事么?留言说出你的存储故事留言点赞前两名,免费送此书截止日期12.27号12.30号公布名单 // 内容简介 本书致力于帮助读者形成有关Linux开源存储世界的细致的拓 ...
- openstack架构详解图_英特尔顶级技术专家合力缔造精品:Linux开源网络全栈详解...
日常水开篇 自1991年诞生起,Linux已经走过了接近三十年.Linux早已没有了问世时的稚气,正在各个领域展示自己成熟的魅力. 以Linux为基础,也衍生出了各种开源生态,例如网络和存储.而生态离 ...
最新文章
- html从入门到精通前锋,街篮新手攻略 从入门到精通的心得分享二
- iBATIS教程之like语句的写法浅析
- Vue2接口地址配置(webpack)
- Windows 技术篇 - windows日期和时间设置里没有Internet 时间页签原因和解决方法
- 6、(二进制类型)BIT、BINARY、VARBINARY、BLOB
- 沉降观测曲线图 沉降观测汇总_这些沉降观测要求,工程人必须掌握!
- win10更新后无法进入linux,双系统win10更新后无法进入linux
- SQL表操作习题4 14~25题 缺20题
- 编写一个Java应用程序,从键盘读取用户输入两个字符串,并重载3个函数分别实现这两个字符串的拼接、整数相加和浮点数相加。要进行异常处理,对输入的不符合要求的字符串提示给用户,不能使程序崩溃。
- 使用generator自动生成Mybatis映射配置文件
- python的jira库操作
- 两天两夜,1M图片优化到100kb!
- c语言闹钟程序教学,C++实现闹钟程序的方法
- python颜色的数字代码_python – 更改QLCD数字的数字颜色
- 不怕新歌有多嗨,就怕老歌带DJ,Python批量对DJ歌曲进行下载
- 塑胶模具设计:产品分型面、插靠破、潜水进胶注意事项
- iwconfig 安装_linux下安装无线驱动
- 科汛在线图文下单系统
- 全面总结 Vue 3.0 的新特性
- 在Mac下使用MindMaster画思维导图(脑图)