【jvm】虚拟机栈之局部变量表

目录

        • 一、说明
        • 二、代码分析
          • 2.1 代码示例
          • 2.2 执行javap
          • 2.3 jclasslib插件查看
        • 三、对slot的理解
          • 3.1 说明
          • 3.2 slot索引图
          • 3.3 实例方法的局部变量表
          • 3.4 long和double类型变量占2个slot
        • 四、slot的重复利用
          • 4.1 说明
          • 4.2 变量c复用变量b的槽位
        • 五、静态变量与局部变量对比

一、说明
  • 1.Local Variables
  • 2.局部变量表也被称为局部变量组或本地变量表
  • 3.定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量,这些数据类型包括各类基本数据类型、对象引用(reference),以及returnAddress类型
  • 4.由于局部变量表是建立在线程的栈上,是线程的私有数据,因此不存在数据安全问题
  • 5.局部变量表所需的容量大小是在编译期确定下来的,并保存在方法的Code属性的maximum local variables数据项中。在方法运行期间是不会改边局部变量表的大小的,因为在java代码编译后就已经确定了
  • 6.方法嵌套调用的次数由栈的大小决定。一般来说,栈越大,方法嵌套调用次数越多。对一个函数而言,它的参数和局部变量越多,使得局部变量表膨胀,它的栈帧就越大,以满足方法调用所需传递的信息增大的需求,函数调用就会占用更多的栈空间,导致其嵌套调用次数就会减少
  • 7.局部变量表中的变量只在当前方法调用中有效。在方法执行时,虚拟机通过使用局部变量表完成参数值到参数变量列表的传递过程。当方法调用结束后,随着方法栈帧的销毁,局部变量表也随之销毁
二、代码分析
2.1 代码示例
package com.learning.stack.local_variables;/*** @Author wangyouhui* @Description 局部变量表测试**/
public class LocalVariableTest {public static void main(String[] args) {LocalVariableTest localVariableTest = new LocalVariableTest();int num = 10;localVariableTest.print();}private void print() {System.out.println("局部变量表");}
}
2.2 执行javap
  • 1.执行javap -v StackOverflowErrorLearning.class
Classfile /F:/jdk-learning/jvm/target/classes/com/learning/stack/local_variables/LocalVariableTest.classLast modified 2023-10-16; size 785 bytesMD5 checksum e16aaaceec49515090d5cb15e4c6467aCompiled from "LocalVariableTest.java"
public class com.learning.stack.local_variables.LocalVariableTestminor version: 0major version: 52flags: ACC_PUBLIC, ACC_SUPER
Constant pool:#1 = Methodref          #8.#26         // java/lang/Object."<init>":()V#2 = Class              #27            // com/learning/stack/local_variables/LocalVariableTest#3 = Methodref          #2.#26         // com/learning/stack/local_variables/LocalVariableTest."<init>":()V#4 = Methodref          #2.#28         // com/learning/stack/local_variables/LocalVariableTest.print:()V#5 = Fieldref           #29.#30        // java/lang/System.out:Ljava/io/PrintStream;#6 = String             #31            // 局部变量表#7 = Methodref          #32.#33        // java/io/PrintStream.println:(Ljava/lang/String;)V#8 = Class              #34            // java/lang/Object#9 = Utf8               <init>#10 = Utf8               ()V#11 = Utf8               Code#12 = Utf8               LineNumberTable#13 = Utf8               LocalVariableTable#14 = Utf8               this#15 = Utf8               Lcom/learning/stack/local_variables/LocalVariableTest;#16 = Utf8               main#17 = Utf8               ([Ljava/lang/String;)V#18 = Utf8               args#19 = Utf8               [Ljava/lang/String;#20 = Utf8               localVariableTest#21 = Utf8               num#22 = Utf8               I#23 = Utf8               print#24 = Utf8               SourceFile#25 = Utf8               LocalVariableTest.java#26 = NameAndType        #9:#10         // "<init>":()V#27 = Utf8               com/learning/stack/local_variables/LocalVariableTest#28 = NameAndType        #23:#10        // print:()V#29 = Class              #35            // java/lang/System#30 = NameAndType        #36:#37        // out:Ljava/io/PrintStream;#31 = Utf8               局部变量表#32 = Class              #38            // java/io/PrintStream#33 = NameAndType        #39:#40        // println:(Ljava/lang/String;)V#34 = Utf8               java/lang/Object#35 = Utf8               java/lang/System#36 = Utf8               out#37 = Utf8               Ljava/io/PrintStream;#38 = Utf8               java/io/PrintStream#39 = Utf8               println#40 = Utf8               (Ljava/lang/String;)V
{public com.learning.stack.local_variables.LocalVariableTest();descriptor: ()Vflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 7: 0LocalVariableTable:Start  Length  Slot  Name   Signature0       5     0  this   Lcom/learning/stack/local_variables/LocalVariableTest;public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=3, args_size=10: new           #2                  // class com/learning/stack/local_variables/LocalVariableTest3: dup4: invokespecial #3                  // Method "<init>":()V7: astore_18: bipush        1010: istore_211: aload_112: invokespecial #4                  // Method print:()V15: returnLineNumberTable:line 9: 0line 10: 8line 11: 11line 12: 15LocalVariableTable:Start  Length  Slot  Name   Signature0      16     0  args   [Ljava/lang/String;8       8     1 localVariableTest   Lcom/learning/stack/local_variables/LocalVariableTest;11       5     2   num   I
}
SourceFile: "LocalVariableTest.java"
  • 2.图示说明
    在这里插入图片描述
2.3 jclasslib插件查看
  • 1.字节码
    在这里插入图片描述

  • 2.异常表
    在这里插入图片描述

  • 3.杂项
    在这里插入图片描述

  • 4.slot槽位
    在这里插入图片描述

三、对slot的理解
3.1 说明
  • 1. 参数值的存放总是在局部变量数组的index0开始,到数组长度-1的索引结束
  • 2. 局部变量表,最基本的存储单元是slot(变量槽)
  • 3. 局部变量表中存放编译器可知的各种基本数据类型(8种),引用类型(reference),returnAddress类型的变量
  • 4.在局部变量表里,32位以内的类型只占用一个slot(包括returnAddress类型),64位的类型(long和double)占用两个slot
  • 5.byte、short、char在存储前被转换为int,boolean也被转为int,0表示false,非0表示true
  • 6. long和double则占据两个slot
  • 7. float占1个slot
  • 8. 引用类型也是32位,占1个slot
  • 9. jvm会为局部变量表中的每一个slot都分配一个访问索引,通过这个索引即可成功访问到局部变量表中指定的局部变量值
  • 10. 当一个实例方法被调用的时候,它的方法参数和方法体内部定义的局部变量将会按照顺序被复制到局部变量表中的每一个slot上
  • 11. 如果需要访问局部变量表中一个64bit的局部变量值时,只需要使用前一个索引即可。比如访问long或double类型变量
  • 12. 如果当前帧是由构造方法或者实例方法创建的,该对象引用this将会存放在index为0的slot处,其余的参数按照参数表顺序继续排列
  • 13. 静态方法中不能用this,是因为静态方法的局部变量表中没有this变量。构造方法和类实例方法的本地变量表index为0的slot处会存放this变量
3.2 slot索引图

在这里插入图片描述

3.3 实例方法的局部变量表

在这里插入图片描述

3.4 long和double类型变量占2个slot

在这里插入图片描述

四、slot的重复利用
4.1 说明
  • 1.栈帧中的局部变量表中的槽位是可以重复利用的
  • 2.如果一个局部变量过了其作用域,在其作用域之后申明的新的局部变量有可能会复用过期的局部变量的槽位,达到节省资源空间的目的
4.2 变量c复用变量b的槽位

在这里插入图片描述

五、静态变量与局部变量对比
  • 1. 参数表分配完毕之后,再根据方法体内定义的变量的顺序和作用域分配
  • 2. 类变量表有两次初始化的机会,第一次是在准备阶段,执行系统初始化,对类变量设置零值,第二次是在初始化阶段,赋予程序员在代码中定义的初始值
  • 3. 局部变量表不存在系统初始化的过程,一旦定义了局部变量则必须程序员来初始化,否则无法使用
  • 4.下面代码是错误的,没有赋值不能使用
    在这里插入图片描述
  • 5. 成员变量在使用前,都经历过默认初始化赋值
  • 6. 成员变量中的类变量在linking的prepare阶段给类变量默认赋值,initial阶段给类变量显示赋值即静态代码块赋值
  • 7. 成员变量中的实例变量随着对象
  • 8. 局部变量在使用前必须要进行显示赋值,否则编译不通过

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/162312.html

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

相关文章

细说雪花算法

文章目录 背景一、介绍二、结构三、数据库分表1.垂直分表2.水平分表&#xff08;1&#xff09;主键自增&#xff08;2&#xff09;取模&#xff08;3&#xff09;雪花算法&#xff08;主角登场&#xff09; 总结 背景 需要选择合适的方案去应对数据规模的增长&#xff0c;以应…

零信任身份管理平台,构建下一代网络安全体系

随着数字化时代的到来&#xff0c;网络安全已成为企业和组织面临的一项重要挑战。传统的网络安全方法已经无法满足不断演变的威胁和技术环境。近期&#xff0c;中国信息通信研究院&#xff08;简称“中国信通院”&#xff09;发布了《零信任发展研究报告&#xff08; 2023 年&a…

通过okhttp调用SSE流式接口,并将消息返回给客户端

通过一个完整的java示例来演示如何通过okhttp来调用远程的sse流式接口 背景&#xff1a;我们有一个智能AI的聊天界面&#xff0c;需要调用三方厂商的大模型chat接口&#xff0c;返回答案&#xff08;因为AI去理解并检索你的问题的时候这个是比较耗时的&#xff0c;这个时候客户…

超实用的Web兼容性测试经验总结,建议Mark

在日常工作中&#xff0c;我们经常碰到网页不兼容的问题。我们之所以要做兼容性测试&#xff0c;目的在于保证待测试项目在不同的操作系统平台上正常运行。 主要包括待测试项目能在同一操作系统平台的不同版本上正常运行&#xff1b;待测试项目能与相关的其他软件或系统的“和…

数据结构-----红黑树的删除操作

目录 前言 一、左旋和右旋 左旋&#xff08;Left Rotation&#xff09; 右旋&#xff08;Right Rotation&#xff09; 二、红黑树的查找 三、红黑树的删除 1.删除的是叶子节点 1.1删除节点颜色为红色 1.2删除节点颜色为黑色 1.2-1 要删除节点D为黑色&#xff0c;兄弟节…

创新与重塑,佛塑科技打造集团型 CRM 建设标杆

“十四五”时期是我国全面建成小康社会、实现第一个百年奋斗目标之后&#xff0c;乘势而上开启全面建设社会主义现代化国家新征程、向第二个百年奋斗目标进军的第一个五年。 在政府有序推进“十四五”规划的进程中&#xff0c;佛山佛塑科技集团股份有限公司&#xff08;证券简…

uni-app--》基于小程序开发的电商平台项目实战(七)完结篇

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;uni-app &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&#xf…

LeetCode【17】电话号码的字母组合

题目&#xff1a; 思路&#xff1a; 参考&#xff1a;https://blog.csdn.net/weixin_46429290/article/details/121888154 和上一个题《子集》的思路一样&#xff0c;先画出树结构&#xff0c;看树的深度&#xff08;遍历层级&#xff09;&#xff0c;树的宽度&#xff08;横向…

【监督学习】基于合取子句进化算法(CCEA)和析取范式进化算法(DNFEA)解决分类问题(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

AI机器视觉多场景应用迸发检测活力,引领食品及包装行业新发展

随着食品安全意识的广泛传播&#xff0c;人们对食品质量和安全的要求越来越高&#xff0c;众多食品包装厂商加速产线数智化转型&#xff0c;迫切需要高效、准确且智能化的检测技术。 在现代食品及包装行业的自动化生产中&#xff0c;涉及到各种各样的识别、检测、测量等环节&a…

用友GRP-U8 SQL注入漏洞复现

0x01 产品简介 用友GRP-U8R10行政事业财务管理软件是用友公司专注于国家电子政务事业&#xff0c;基于云计算技术所推出的新一代产品&#xff0c;是我国行政事业财务领域最专业的政府财务管理软件。 0x02 漏洞概述 用友GRP-U8的bx_historyDataCheck jsp、slbmbygr.jsp等接口存…

C++基础——内存分区模型

1 概述 C程序在执行是&#xff0c;将内存大致分为4个区域&#xff1a; 代码区&#xff1a;用于存放二进制代码&#xff0c;由操作系统进行管理全局区&#xff1a;存放全局变量和静态变量及常量栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数、局部变量等堆…

React中的key有什么作用

一、是什么 首先&#xff0c;先给出react组件中进行列表渲染的一个示例&#xff1a; const data [{ id: 0, name: abc },{ id: 1, name: def },{ id: 2, name: ghi },{ id: 3, name: jkl } ];const ListItem (props) > {return <li>{props.name}</li>; };co…

Python中的循环语句Cycle学习

二、循环语句 1、什么是循环语句 一般编程语言都有循环语句,为什么呢? 那就问一下自己,我们弄程序是为了干什么? 那肯定是为了方便我们工作,优化我们的工作效率啊。 而计算机和人类不同,计算机不怕苦也不怕累,也不需要休息,可以一直做。 你要知道,计算机最擅长就…

FPR3346501R1012 数据科学与人工智能:主要区别

FPR3346501R1012 数据科学与人工智能:主要区别 当谈到数据科学和人工智能(人工智能)&#xff0c;你会经常发现两个技能路径之间有很多交集。人工智能有许多子集&#xff0c;比如机器学习和深度学习&#xff0c;以及数据科学利用这些技术来解释和分析数据&#xff0c;发现模式…

云上攻防-云原生篇KubernetesK8s安全APIKubelet未授权访问容器执行

文章目录 K8S集群架构解释K8S集群攻击点-重点API Server未授权访问&kubelet未授权访问复现k8s集群环境搭建1、攻击8080端口&#xff1a;API Server未授权访问2、攻击6443端口&#xff1a;API Server未授权访问3、攻击10250端口&#xff1a;kubelet未授权访问 K8S集群架构解…

让GPT回复图片的咒语

咒语如下&#xff1a; 帮我画一张图关于XXXXX,用3/8Markdown 写&#xff0c;不要有反斜钱,不要用代码块。使用Unsplash APl(https://source.unsplash.com/1280x720/?<PUT YOUR QUERY HERE >) Over! ​​​​​​​

Android---DVM以及ART对JVM进行优化

Dalvik Dalvik 是 Google 公司自己设计用于 Android 平台的 Java 虚拟机&#xff0c;Android 工程师编写的 Java 或者 Kotlin 代码最终都是在这台虚拟机中被执行的。在 Android 5.0 之前叫作 DVM&#xff0c;5.0 之后改为 ART&#xff08;Android Runtime&#xff09;。在整个…

GPIO基本原理

名词解释 高低电平&#xff1a;GPIO引脚电平范围&#xff1a;0V~3.3V&#xff08;部分引脚可容忍5V&#xff09;数据0就是0V&#xff0c;代表低电平&#xff1b;数据1就是3.3V&#xff0c;代表高电平&#xff1b; STM32是32位的单片机&#xff0c;所以内部寄存器也都是32位的…

国产单片机PY32F002B,32位ARM架构Cortex -M0+内核,性价比高

PY32F002B是普冉推出的新一代入门级32位MCU&#xff0c;内核使用 ARM Cortex M0&#xff0c;主频最高支持到24M&#xff0c;24K FLASH 3K SRAM存储&#xff0c;并支持1.7V~5.5V宽工作电压&#xff0c;-40 ~ 85 C工作温度。拥有1 x 12 位ADC、I2C、SPI、USART、TIM、LPTIM、IWDT…