JVM中的栈和局部变量

VM虚拟机下,通过无线,有线两种方式连接PLC的设置方法 1,VMware软件:编辑>虚拟网络编辑器。 2.右下角:更改设置(如果可以选中“添加网络”选项,则可考虑略过此步) 3.选中VMnet0,点击桥接模式,选中你的物理机有线网卡。点击确定。 4.点击添加网络,我的添加完是VMnet2,然后选中,像上一步样,点击桥接模式,在下拉菜单中选中笔记本的【无线网卡】,然后点击确定。 5.VMware软件:虚拟机>设置。 6.点击 添加>网络... 阅读详情

JVM中的栈和局部变量  

Java开发中,每当我们在程序中使用new生成一个对象,对象的引用存放在栈里,而对象是存放在堆里的。可以看出栈在Java核心的重要位置。今天我们就继续深入Java核心这个系列,为您介绍Java中的栈、局部变量及其之间的关系。

Java中的栈

每当启用一个线程时,JVM就为他分配一个Java栈,栈是以帧为单位保存当前线程的运行状态。某个线程正在执行的方法称为当前方法,当前方法使用的栈帧称为当前帧,当前方法所属的类称为当前类,当前类的常量池称为当前常量池。当线程执行一个方法时,它会跟踪当前常量池。

每当线程调用一个Java方法时,JVM就会在该线程对应的栈中压入一个帧,这个帧自然就成了当前帧。当执行这个方法时,它使用这个帧来存储参数、局部变量、中间运算结果等等。

Java栈上的所有数据都是私有的。任何线程都不能访问另一个线程的栈数据。所以我们不用考虑多线程情况下栈数据访问同步的情况。

像方法区和堆一样,Java栈和帧在内存中也不必是连续的,帧可以分布在连续的栈里,也可以分布在堆里

Java栈的组成元素——栈帧

栈帧由三部分组成:局部变量区、操作数栈、帧数据区。局部变量区和操作数栈的大小要视对应的方法而定,他们是按字长计算的。但调用一个方法时,它从类型信息中得到此方法局部变量区和操作数栈大小,并据此分配栈内存,然后压入Java栈。

局部变量区 局部变量区被组织为以一个字长为单位、从0开始计数的数组,类型为short、byte和char的值在存入数组前要被转换成int值,而long和 double在数组中占据连续的两项,在访问局部变量中的long或double时,只需取出连续两项的第一项的索引值即可,如某个long值在局部变量 区中占据的索引时3、4项,取值时,指令只需取索引为3的long值即可。

下面就看个例子,好让大家对局部变量区有更深刻的认识。这个图来自《深入JVM》:

  
  1. public static int runClassMethod(int i,long l,float f,double d,Object o,byte b) {     
  2.         return 0;     
  3.     }     
  4.          
  5.     public int runInstanceMethod(char c,double d,short s,boolean b) {     
  6.         return 0;     
  7.     }    

上面代码片的方法参数和局部变量在局部变量区中的存储结构如下图:

局部变量区的存储结构

上面这个图没什么好说的,大家看看就会懂。但是,在这个图里,有一点需要注意:

runInstanceMethod的局部变量区第一项是个reference(引用),它指定的就是对象本身的引用,也就是我们常用的this,但是在runClassMethod方法中,没这个引用,那是因为runClassMethod是个静态方法。 

操作数栈和局部变量区一样,操作数栈也被组织成一个以字长为单位的数组。但和前者不同的是,它不是通过索引来访问的,而是通过入栈和出栈来访问的。可把操作数栈理解为存储计算时,临时数据的存储区域。下面我们通过一段简短的程序片段外加一幅图片来了解下操作数栈的作用。

int a = 100;

int b = 98;

int c = a+b;

操作数栈的结构

从图中可以得出:操作数栈其实就是个临时数据存储区域,它是通过入栈和出栈来进行操作的。

帧数据区除了局部变量区和操作数栈外,Java栈帧还需要一些数据来支持常量池解析、正常方法返回以及异常派发机制。这些数据都保存在Java栈帧的帧数据区中。
当JVM执行到需要常量池数据的指令时,它都会通过帧数据区中指向常量池的指针来访问它。

除了处理常量池解析外,帧里的数据还要处理Java方法的正常结束和异常终止。如果是通过return正常结束,则当前栈帧从Java栈中弹出,恢复发起调用的方法的栈。如果方法又返回值,JVM会把返回值压入到发起调用方法的操作数栈。

为了处理Java方法中的异常情况,帧数据区还必须保存一个对此方法异常引用表的引用。当异常抛出时,JVM给catch块中的代码。如果没发现,方法立即终止,然后JVM用帧区数据的信息恢复发起调用的方法的帧。然后再发起调用方法的上下文重新抛出同样的异常。

栈的整个结构

在前面就描述过:栈是由栈帧组成,每当线程调用一个Java方法时,JVM就会在该线程对应的栈中压入一个帧,而帧是由局部变量区、操作数栈和帧数据区组成。那在一个代码块中,栈到底是什么形式呢?下面是我从《深入JVM》中摘抄的一个例子,大家可以看看:

代码片段:

栈的整个结构代码示例

执行过程中的三个快照:

上面所给的图,只想说明两件事情,我们也可用此来理解Java中的栈:

1、只有在调用一个方法时,才为当前栈分配一个帧,然后将该帧压入栈。

2、帧中存储了对应方法的局部数据,方法执行完,对应的帧则从栈中弹出,并把返回结果存储在调用方法的帧的操作数栈中。


高德地图JS API私有化部署实战:从数据爬取到内网集成 本文详细介绍了高德地图JS API私有化部署的完整流程,涵盖从地图瓦片数据爬取、JS API离线化改造到内网项目集成的实战步骤。重点解决了在封闭内网环境中实现地图功能的核心难题,并提供了Vue.js项目中的具体集成代码与调试技巧,帮助开发者在离线环境下构建稳定可靠的地图应用。 阅读详情

相关推荐

基于MOS的防反接电路

防反接电路一般用于电源入口处,在电源反接时,保证电源入口之后的电路不会受到损害。一般在电源电流较小、对1V左右的压降不敏感时可以使用二极管进行防反接。防反接的形式有直接在正极串联二极管(如图1),或使用整流桥的方式(如图2),但这两种方式均存在:1、存在二极管的管压降;2、过大电流时,二极管消耗的功率大,发热严重。这两个问题。 图 1 二极管防反接电路 图 2 整流管防反接电路 1、基于NMO...

qq_42682826的博客 2万+

JVM中的栈和局部变量(转)

Java开发中,每当我们在程序中使用new生成一个对象,对象的引用存放在栈里,而对象是存放在堆里的。可以看出栈在Java核心的重要位置。今天我们就继续深入Java核心这个系列,为您介绍Java中的栈、局部变量及其之间的关系。 Java中的栈 每当启用一个线程时,JVM就为他分配一个Java栈,栈是以帧为单位保存当前线程的运行状态。某个线程正在执行的方法称为当前方法,当前方法使用的栈帧称为当前帧,当...

先相信你自己,然后别人才会相信你。 433

《C语言小游戏之贪吃蛇程序代码》

//为广大编程游戏爱好者提供一个参考的游戏源代码#include<stdio.h>#include<conio.h>#include<windows.h>#include<time.h>#define framex 5#define framey 5#define wide 20#define high 20int i,j,a[2];//将光标移动到...

qq_42052821的博客 2万+

Java多线程(1)多线程访问成员变量与局部变量

1、多线程访问成员变量与局部变量说明 1、java多线程调用 单例类中一个的方法是不会排队的 因为jvm 在每个线程下,都有一份 对调用方法的引用。 2、多个线程调用的同一个对象的同一个方法: 如果方法里无成员变量,不受任何影响; 如果方法里有成员变量,只有读操作,不受影响,存在赋值操作,有影响 3、多线程调用同一个方法,局部变量会共享吗? 局部变量不会受多线程影响; 成员变量会受到多线程影响 jvm每个线程都拥有一个方法调用栈,用于跟踪线程中运行的一系列方法调用过程, 栈中的每个元素成为栈帧,

mingyuli的博客 6463

保姆级教程:在Android车机上从零配置USB Gadget,搞定CarPlay有线连接

本文详细介绍了在Android车机上从零配置USB Gadget以实现CarPlay有线连接的完整实践指南。涵盖内核驱动开发、Android系统配置及用户空间通信架构,帮助开发者深入理解USB子系统和iAP2协议栈,实现稳定可靠的CarPlay有线连接功能。

weixin_30621711的博客 470

别光看文档了!手把手带你用Habitat-Lab跑通第一个PointNav任务(附完整代码与避坑指南)

本文详细介绍了如何使用Habitat-Lab快速跑通第一个PointNav任务,包括环境配置、依赖安装、数据集下载与路径配置等关键步骤,并提供了完整的代码实现与常见问题排查指南。特别适合刚接触Habitat-Lab的开发者,帮助避开官方Quickstart未提及的坑,快速上手具身AI任务。

weixin_42662293的博客 269

多线程基础讲解四: 线程安全问题 (全局变量 与 局部变量,谁会有线程安全问题 ?)

什么是线程安全问题: 当多个线程共享同一个全局变量,并做写的操作的时候,可能会受到其他线程的干扰,导致数据有问题,这种现象就叫做线程安全问题。 全局变量 与 局部变量,谁会有线程安全问题 ? 全局变量才会有线程安全问题。在方法内部的局部变量中,每个线程都有自己的局部变量,相互不会干扰。 这里说全局变量有安全问题,就在说一个面试题(我面试全友家私的时候面试官问我的问题):String ,StringBuffer,StringBuilder 什么时候使用他们 ? 首先,String是.....

chuxin_mm的博客 3171

GD32F470实战:如何用EXMC+SDRAM为LVGL打造超大内存池(附完整配置代码)

本文详细介绍了如何利用GD32F470的EXMC接口与SDRAM深度整合,为LVGL构建高性能内存解决方案。通过硬件架构设计、EXMC接口配置、高级内存管理策略及LVGL性能优化技巧,开发者可以突破微控制器内存限制,实现高分辨率显示和复杂动画效果。附完整配置代码,助力嵌入式GUI开发。

rrr55的博客 544

别翻了,成员变量和局部变量在多线程中的使用,看这篇就够了

别翻了,成员变量和局部变量在多线程中使用的区别,看这篇就够了

weixin_43899069的博客 8920

YOLOv11改进 | 模型知识蒸馏篇 | 利用模型蒸馏改进YOLOv11进行无损涨点 | 在线蒸馏 (附代码 + 完整文件 + 解析教程)

这篇文章给大家带来的最新改进是模型的蒸馏,利用教师模型指导学生模型从而进行模型的涨点,本文的内容不仅可以用于论文中,在目前的绝大多数的工作中模型蒸馏是一项非常重要的技术,所以大家可以仔细学习一下本文的内容,本文从YOLOv11的项目文件为例,进行详细的修改教程,文章内包括完整的修改教程,针对小白我出了视频修改教程,如果你还不会我提供了修改后的文件大家直接运行即可,所以说不用担心不会适用!模型蒸馏真正的无损涨点,蒸馏你只看这一篇文章就足够了,本文内容为在线蒸馏教程,之前的文章为离线蒸馏!

Snu77的博客 2666

图像处理之边缘检测[微分算子、Canny算子和LOG算子]

LOG算子是在经典算子的基础上发展起来的边缘检测算子,根据信噪比求得检测边缘的最优滤波器。边缘总是以强度突变的形式出现,可以定义为图像局部特性的不连续性,如灰度的突变和纹理结构的突变等。图像的边缘包含了物体形状的重要信息,它不仅在分析图像时大幅度地减少了要处理的信息量,而且还保护了目标的边界结构。对于复杂的图像,采用Roberts算子不能较好地得到图像的边缘,而需要采用更加复杂的3X3的算子比如Prewitt算子。对于离散的图像f(x,y),边缘检测算子是用图像的垂直和水平差分来逼近梯度算子,即。

qq_44111805的博客 9833

多线程调用一个单例对象的方法会不会阻塞?

不会,

sunshy_3104的博客 1920

uniapp [全端兼容] - 详细实现下拉筛选菜单功能组件,下拉式筛选菜单效果,类似电商美团点击筛选项底部弹出列表点击选择后自动收起(详细示例代码,全端兼容小程序、安卓苹果app、h5网页、nvue

uni-app,vue2,vue3,向下弹出菜单包含筛选功能,日期筛选,下拉框选择器,下拉多条件筛选,下拉式筛选菜单,uniApp如何实现条件下拉筛选,Uniapp官方条件筛选组件,下拉框式条件筛选插件组件,最好用的插件组件,多端兼容,下拉菜单筛选,过滤筛选列表,下拉筛选栏,多列联动的条件筛选,下拉菜单地区和筛选,微信小程序,支付宝小程序,h5网页,移动端网站,安卓app,苹果app,nvue,uniapp所有平台兼容,下拉菜单筛选,下拉式条件筛选,下拉列表,点击排序,级联筛选,uniapp实现下拉筛选

🏆 前端领域优质创作者 1万+

【JVM】栈帧与局部变量表详解

栈帧(Stack Frame)是 JVM 方法执行时所使用的数据结构。每当 JVM 调用一个方法时,都会为该方法创建一个新的栈帧。栈帧存储了方法执行过程中所需的局部变量、操作数栈、动态链接、方法返回地址等信息。栈帧在 JVM 栈中进行分配,每次方法调用会对应压入一个新的栈帧,当方法执行完毕后,栈帧会从栈中弹出。由于每个线程都有自己的 JVM 栈,因此栈帧是线程私有的,其他线程不能访问。

m0_38053034的博客 1165

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java 栈的变量_JVM中的栈和局部变量

在Java程序中,每当启用一个线程时,JVM就为他分配一个Java栈,栈是以帧为单位保存当前线程的运行状态。今天我们继续深入Java核心,探秘JVM中的栈和局部变量。Java开发中,每当我们在程序中使用new生成一个对象,对象的引用存放在栈里,而对象是存放在堆里的。可以看出栈在Java核心的重要位置。今天我们就继续深入Java核心这个系列,为您介绍Java中的栈、局部变量及其之间的关系。Java中...

weixin_42298878的博客 620

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

简识JVM栈帧中的局部变量表

前记:在JVM(Java虚拟机)中,栈帧(Stack Frame)是方法执行时的数据结构,用于存储局部变量、操作数栈、方法返回地址等信息。栈帧(Stack Frame)是JVM方法执行时所使用的数据结构,而局部变量表(Local Variables Table)则是栈帧中的一个重要组成部分。

qq_37679639的博客 739

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

JVM 汇编指令 栈和局部变量操作

博文目录 文章目录将常量压入栈的指令从栈中的局部变量中装载值的指令将栈中的值存入局部变量的指令wide指令通用(无类型)栈操作类型转换整数运算逻辑运算移位操作按位布尔运算浮点运算对象和数组对象操作指令数组操作指令控制流条件分支指令比较指令无条件转移指令表跳转指令异常finally子句方法调用与返回方法调用指令方法返回指令线程同步JVM指令助记符 将常量压入栈的指令 aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0

mrathena 613

java中的局部变量表和栈的关系_JVM 栈帧之操作数栈与局部变量表

前置知识阅读本文需要对以下知识有所了解:* 栈* 汇编* Java 基础* 逆波兰表达式(有学过的同学阅读本文毫无障碍)引子基于寄存器的设计模式就我们所熟知的x86或arm指令集来说,其对数据的操作都是基于寄存器。例如,要对两个数执行加法操作则需要将这两个数分别送入两个寄存器再执行加法操作,这也符合我们对于编程语言认知,更加易于理解。基于栈的设计模式基于栈的设计模式则是将数据存放在栈中,在需要使用...

weixin_42502075的博客 660

JVM栈帧中|局部变量表、操作数栈、动态链接各自的任务是什么?

JVM栈帧中|局部变量表、操作数栈、动态链接各自的任务是什么?

liuruiaaa的博客 784

JVM 栈帧之操作数栈与局部变量表

[TOC] 前置知识 阅读本文需要对以下知识有所了解: * 栈 * 汇编 * Java 基础 * 逆波兰表达式(有学过的同学阅读本文毫无障碍) 引子 基于寄存器的设计模式 就我们所熟知的x86或arm指令集来说,其对数据的操作都是基于寄存器。例如,要对两个数执行加法操作则需要将这两个数分别送入两个寄存器再执行加法操作,这也符合我们对于编程语言认知,更加易于理解。 基于栈的设计模式 基于栈...

dnuvb68642的博客 642

JVM虚拟机栈(局部变量表与操作数栈)

JVM虚拟机栈(局部变量表与操作数栈) 虚拟机栈概述 由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 优点时跨平台,指令集小,编译器容易实现,缺点时性能下降,实现同样的功能需要更多的指令。 栈是运行时的单位,堆时存储的单位。栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储问题,即数据怎么放,放在哪里。 public class StackTest{ public static void main(Strin

anying5823的博客 3086

通过一个简单的例子来看看jvm来理解局部变量表和操作数栈

JVM内存模型如上图所示.但是运行时方法在java代码运行时是如何运转的呢.下面我们通过一个简单的代码来看看运行时方法区的各个模块是如何运转的 package com.bonc.jvm; /** * @Classname JVMTest * @Description TODO * @Date 2020/6/14 10:54 * @Created by sz */ public class JVMTest { public static User user = new User(); .

踏雪江南的博客 499

JVM虚拟机栈中的局部变量表

JVM虚拟机栈中的局部变量表 局部变量存放了编译期可知的各种Java虚拟机基本数据类型(boolean、byte、char、short、 int、float、long、double)、对象引用(reference类型 ,它并不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或者其他与此对相象关的位置) returnAddress类型(指向了一条字节码指令的地址 )。 这些数据类型在局部变量表中的存储空间以局部变量槽(Slot)来表示,其中64位长度的long和double的

L2992786的博客 661

JVM 栈帧结构:局部变量表 + 操作数栈 + 方法返回地址解析

本文深入解析JVM栈帧的核心组成与工作原理,揭示方法调用背后的底层机制。通过实际案例展示常见错误:局部变量未初始化导致的编译错误、递归过深引发的StackOverflowError、异常返回时的资源泄漏等。重点讲解栈帧三大部分:局部变量表(需显式初始化)、操作数栈(遵循先进后出运算规则)和方法返回地址(异常时同样有效)。提供生产环境最佳实践,包括合理设置栈大小、资源释放规范、递归优化方案等。文章结合Java17+特性,帮助开发者深入理解方法执行过程,避免90%的栈相关错误,提升代码健壮性。

m0_67391377的博客 994

JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)

栈的存储单位 局部变量表 操作数栈 代码追踪 栈顶缓存技术 动态链接 方法调用:解析与分派 方法返回地址 附加信息 相关试题

秃头不用洗发水的博客 690
上一篇: JAVA finally字句的异常丢失和返回值覆盖解析
下一篇: JAVA中的引用到底是传值还是传址?
lioncode
博客等级 码龄18年 67粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值