Java内存模型中的虚拟机栈原理分析
作者:Demrystv 发布时间:2022-02-08 04:41:33
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都会有各自的用途,以及创建和销毁的时间,有的区域会随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。Java虚拟机所管理的内存将会包括以下几个运行时数据区域。如下图所示(图片来自《深入理解Java虚拟机》一书)。
在内存中,栈分为两部分,一部分是本地方法栈,为虚拟机使用到的Native方法服务,具体的虚拟机可以自由实现,另一部分就是虚拟机栈,主要是为虚拟机执行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


猜你喜欢
- 以往都是使用反射调用实例方法,那么反射如何调用静态方法呢?看下面的例子Class<?> threadClazz = Class.
- nacos使用占位符${}进行参数配置的方法有的时候,我们的nacos会出现一个配置文件里,有多个配置项对应的值都是一样的,这个时候naco
- C#申请一个大数组(Use a large array in C#)在C#里,有时候我需要能够申请一个很大的数组、使用之、然后立即释放其占用
- 介绍意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更灵活。主要解决:我们扩展一个类常使用继承方式实现,由于继
- 什么是SkyWalking查看官网https://skywalking.apache.org/分布式系统的应用程序性能监视工具,专为微服务、
- 本文实例为大家分享了Unity UI实现拖拽旋转的具体代码,供大家参考,具体内容如下跟随鼠标旋转第一种效果是跟随鼠标旋转,原理是计算下鼠标位
- 微信支付最近公司要在微信公众号上做一个活动预报名,活动的门票等需要在微信中支付。微信支付前的准备微信支付需要一个微信支付商务号(https:
- 前言:微信公众号提供了用户和用户组的管理,我们可以在微信公众号官方里面进行操作,添加备注和标签,以及移动用户组别,同时,微信公众号提供了相应
- 前言MVC模式是目前主流项目的标准开发模式,这种模式下框架的分层结构清晰,主要分为Controller,Service,Dao。分层的结构下
- 最近看spring的JDBCTemplete的模板方式调用时,对模板和回调产生了浓厚兴趣,查询了一些资料,做一些总结。回调函数:所谓回调,就
- 1、StatefulWidget的背后flutter开发过程中,我们经常会用到两个组件StatelessWidget和StatefulWid
- 目标线程的join方法暂停当前线程,直到目前线程完成(从run()方法返回),供大家参考,具体内容如下Java代码:package Thre
- using System;using System.Collections.Generic;using System.Text;using
- Spring Boot 异常处理异常处理是一种识别并响应错误的一致性机制,异常机制可以把程序中的异常处理代码和正常的业务逻辑代码分离,包装程
- tjxCold(根据配置模板,快速生成controller,service,serviceimpl 代码) 为什么要开发这款插件市面上有很多
- 在阅读本文之前,大家可以先参考下《多模字符串匹配算法原理及Java实现代码》简介:本文是博主自身对AC自动机的原理的一些理解和看法,主要以举
- 使用Android Studio 创建Android项目,分享给大家(1) 说明:还有一部分人在坚持使用 Eclipse ,建议抓紧换掉。使
- 一、项目简述功能包括: 该系统不错分为学生,教师,管理员,教导主任四种角 色,包括学生管理,教师管理,学生选题,教师选题,主 任审核,管理员
- 1、多个线程对同一个队列进行读写操作,要注意进行读写控制,某个线程在读取的时候,不允许其它线程读、写;某个线程在写的时候,不允许其它线程进行
- Selenium IDE 是Firefox 浏览器的一个插件, 它会记录你对Firefox的操作,并且可以回放它的操作。 用法简单,不过我觉