Java内存模型中的虚拟机栈原理分析

作者:Demrystv 时间:2022-02-08 04:41:33 

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都会有各自的用途,以及创建和销毁的时间,有的区域会随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。Java虚拟机所管理的内存将会包括以下几个运行时数据区域。如下图所示(图片来自《深入理解Java虚拟机》一书)。

Java内存模型中的虚拟机栈原理分析

在内存中,栈分为两部分,一部分是本地方法栈,为虚拟机使用到的Native方法服务,具体的虚拟机可以自由实现,另一部分就是虚拟机栈,主要是为虚拟机执行Java方法服务,因此也成为Java栈,本文主要是对虚拟机栈进行详细解读。

Java内存模型中的虚拟机栈原理分析

1. Java栈也称为虚拟机栈,也就是我们常常所说的栈。 Java栈是Java方法执行的内存模型。

2. Java栈中存放的是一个个的栈帧,每个栈帧对应一个被调用的方法,在栈帧中包括局部变量表(Local Variables)、操作数栈(Operand Stack)、指向当前方法所属的类的运行时常量池(运行时常量池的概念在方法区部分会谈到)的引用(Reference to runtime constant pool)、方法返回地址(Return Address)和一些额外的附加信息。 当线程执行一个方法时,就会随之创建一个对应的栈帧,并将建立的栈帧压栈。当方法执行完毕之后,便会将栈帧出栈。 因此对于方法没有存在回收资源一说 。

3. 局部变量表,顾名思义,想必不用解释大家应该明白它的作用了吧。就是用来存储方法中的局部变量(包括在方法中声明的非静态变量以及函数形参)。对于基本数据类型的变量,则直接存储它的值,对于引用类型的变量,则存的是指向对象的引用。局部变量表的大小在编译器就可以确定其大小了,因此在程序执行期间局部变量表的大小是不会改变的。

4. 操作数栈,想必学过数据结构中的栈的朋友想必对表达式求值问题不会陌生,栈最典型的一个应用就是用来对表达式求值。想想一个线程执行方法的过程中,实际上就是不断执行语句的过程,而归根到底就是进行计算的过程。因此可以这么说,程序中的所有计算过程都是在借助于操作数 。

5. 指向运行时常量池的引用,因为在方法执行的过程中有可能需要用到类中的常量,所以必须要有一个引用指向运行时常量。

6. 方法返回地址,当一个方法执行完毕之后,要返回之前调用它的地方,因此在栈帧中必须保存一个方法返回地址。

7. 由于每个线程正在执行的方法可能不同,因此每个线程都会有一个自己的Java栈,互不干扰。

来源:https://www.cnblogs.com/Demrystv/p/9352067.html

标签:java,内存,模型,虚拟,机,栈
0
投稿

猜你喜欢

  • C#判断获取的是文件夹还是文件的实例

    2022-11-25 05:00:01
  • IDEA 2022 中的Lombok 使用基础教程

    2023-04-09 21:57:09
  • java实现把对象数组通过excel方式导出的功能

    2022-07-01 13:20:09
  • Java selenium处理极验滑动验证码示例

    2023-12-19 19:10:09
  • Java listener简介_动力节点Java学院整理

    2022-12-29 10:02:48
  • Springboot整个Quartz实现动态定时任务的示例代码

    2023-04-12 20:30:02
  • java面试常见问题之Hibernate总结

    2023-11-27 10:37:05
  • Mybatis配置之<typeAliases>别名配置元素解析

    2023-08-02 03:09:54
  • Java操作pdf的工具类itext的处理方法

    2023-07-14 11:51:53
  • 详解Java代码常见优化方案

    2023-11-29 03:13:04
  • SpringBoot SpEL语法扫盲与查询手册的实现

    2022-06-02 23:52:39
  • C#实现创建标签PDF文件的示例代码

    2023-09-15 07:04:58
  • Mybatis批量操作sql写法示例(批量新增、更新)

    2022-12-06 15:19:16
  • struts2 validation.xml 验证规则代码解析

    2021-09-14 22:01:27
  • C++容器适配与栈的实现及dequeque和优先级详解

    2023-11-02 12:57:52
  • C#日期格式强制转换方法(推荐)

    2022-09-19 10:24:57
  • Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException

    2023-11-08 14:48:13
  • java实现列表、集合与数组之间转化的方法

    2023-11-29 10:17:38
  • Spring实战之属性覆盖占位符配置器用法示例

    2023-02-02 00:05:30
  • 浅谈Java中的重载,重写,多态,静态绑定、动态绑定

    2023-10-10 02:40:05
  • asp之家 软件编程 m.aspxhome.com