【转帖】16.JVM栈帧内部结构-局部变量表
1.局部变量表(Local variables)
1.局部变量表也称为局部变量数组或本地变量表。
2.局部变量表定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量。(局部变量表的作用)
3.局部变量表示栈帧中的数据,栈帧被线程私有,所以不存在线程安全的问题,也就是多线程之间不会相互影响。(这里并不是绝对的,其实有可能出现线程安全问题,参考https://blog.csdn.net/u011069294/article/details/107157140)
4.局部变量表的大小在编译时期确定。一旦确定,就不会再改变。
查看局部变量表:将下面的java代码产生的class文件使用javap进行反编译。
public class LocalVariablesTest {
public static void main(String[] args) {
LocalVariablesTest test = new LocalVariablesTest();
int num = 10;
}
}
找到生成的LocalVariablesTest.class文件,使用javap -v LocalVariablesTest, 输出如下,最下面有一个LocalVariableTable就是局部变量表。
可以看到局部变量表存储了三个变量,分别为args,test,num。并且都有大小solt。总共加起来的solt是3。这里就可以看出来,局部变量表的大小是在编译器确定的。因为我们只是反编译了class文件,就能够看到局部变量表以及它的大小。
D:\Eclipse_workspace\JVM\jvn\bin\jvn>javap -v LocalVariablesTest
Classfile /D:/Eclipse_workspace/JVM/jvn/bin/jvn/LocalVariablesTest.class
Last modified 2020-7-1; size 466 bytes
MD5 checksum 24673853d3865f4d8d0bab8ca5b3435b
Compiled from "LocalVariablesTest.java"
public class jvn.LocalVariablesTest
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Class #2 // jvn/LocalVariablesTest
#2 = Utf8 jvn/LocalVariablesTest
#3 = Class #4 // java/lang/Object
#4 = Utf8 java/lang/Object
#5 = Utf8 <init>
#6 = Utf8 ()V
#7 = Utf8 Code
#8 = Methodref #3.#9 // java/lang/Object."<init>":()V
#9 = NameAndType #5:#6 // "<init>":()V
#10 = Utf8 LineNumberTable
#11 = Utf8 LocalVariableTable
#12 = Utf8 this
#13 = Utf8 Ljvn/LocalVariablesTest;
#14 = Utf8 main
#15 = Utf8 ([Ljava/lang/String;)V
#16 = Methodref #1.#9 // jvn/LocalVariablesTest."<init>":()V
#17 = Utf8 args
#18 = Utf8 [Ljava/lang/String;
#19 = Utf8 test
#20 = Utf8 num
#21 = Utf8 I
#22 = Utf8 SourceFile
#23 = Utf8 LocalVariablesTest.java
{
public jvn.LocalVariablesTest();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 3: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Ljvn/LocalVariablesTest;
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=3, args_size=1
0: new #1 // class jvn/LocalVariablesTest
3: dup
4: invokespecial #16 // Method "<init>")V
7: astore_1
8: bipush 10
10: istore_2
11: return
LineNumberTable:
line 5: 0
line 6: 8
line 7: 11
LocalVariableTable: // 局部变量表,可以看到局部变量表存储了三个变量,分别为args,test,num。并且都有大小solt。总共加起来的solt是3。这里就可以看出来,局部变量表的大小是在编译期确定的。因为我们只是反编译了class文件,就能够看到局部变量表以及它的大小。
Start Length Slot Name Signature
0 12 0 args [Ljava/lang/String;
8 4 1 test Ljvn/LocalVariablesTest;
11 1 2 num I
}
SourceFile: "LocalVariablesTest.java"
5.方法嵌套调用的次数由栈的大小决定。栈越大,方法嵌套调用的次数越多。一个方法,参数和局部变量越多,栈帧就越大,函数调用占用的栈空间就越大,其能够嵌套调用的次数就越少。
6.局部变量表中的变量只在当前方法中有效。当方法调用结束后,随着方法栈帧的销毁,局部变量表也会随之销毁。
局部变量表补充说明:
1.在栈帧中,与性能调优关系最为密切的部分就是前面提到的局部变量表。在方法执行时,虚拟机使用局部变量表完成方法的传递。
2.局部变量表中的变量也是重要的垃圾回收根节点,只要被局部变量表中直接或间接引用的对象都不会被回收。
更多JVM文章请参考我的JVM专栏:https://blog.csdn.net/u011069294/category_10113093.html
【转帖】16.JVM栈帧内部结构-局部变量表的更多相关文章
- JVM 栈帧之操作数栈与局部变量表
目录 前置知识 引子 基于寄存器的设计模式 基于栈的设计模式 一个简单的例子 如何查看局部变量表? 实例方法中的局部变量表 结论 前置知识 阅读本文需要对以下知识有所了解: * 栈 * 汇编 * Ja ...
- 栈帧的内部结构--局部变量表(Local Variables)
每个栈帧中包含: 局部变量表(Local Variables) 操作数栈(Opreand Stack) 或表达式栈 动态链接 (Dynamic Linking) (或指向运行时常量的方法引用) 动态返 ...
- JVM-栈帧之局部变量表
1.栈帧的内部结构 每个栈帧中存储着: 局部变量表(Local Variables) 操作数栈(Operand Stack)(或表达式栈) 动态链接(Dynamic Linking)(或指向运行时常量 ...
- jvm学习笔记:栈帧
栈帧内的数据结构 局部变量表(Local Variables):记录非静态方法的this指针.方法参数.局部变量 操作数栈(Operand Stack):用于计算的栈结构 动态链接(Dynamic L ...
- Java虚拟机栈--栈帧
栈帧的内部结构 每个栈帧中存储着 1.局部变量表(Local Variables) 2.操作数栈(Operand Stack)(或表达式栈) 3.动态链接(Dynamic Linking)(或执行&q ...
- [转帖]【JVM 知识体系框架总结】
[JVM 知识体系框架总结] https://www.cnblogs.com/mousycoder/p/11612448.html JVM 内存分布 线程共享数据区:方法区->类信息,静态变量堆 ...
- java虚拟机规范-运行时栈帧
前言 java虚拟机是java跨平台的基石,本文的描述以jdk7.0为准,其他版本可能会有一些微调. 引用 java虚拟机规范 java虚拟机规范-运行时数据区 java内存运行时的栈帧结构 java ...
- 深入理解java虚拟机(十) Java 虚拟机运行时栈帧结构
运行时栈帧结构 栈帧(Stack Frame) 是用于虚拟机执行时方法调用和方法执行时的数据结构,它是虚拟栈数据区的组成元素.每一个方法从调用到方法返回都对应着一个栈帧入栈出栈的过程. 每一个栈帧在编 ...
- Java中的局部变量表及使用jclasslib进行查看
直接上下载地址 jclasslib是一个独立的工具,不是包含在JDK中的工具,需要自己进行下载,下载地址如下: http://downfile.downcc.com/down/JClassLib_wi ...
- 【死磕JVM】一道面试题引发的“栈帧”!!!
前言 最近小农的朋友--小勇在找工作,开年来金三银四,都想跳一跳,找个踏(gao)实(xin)点的工作,这不小勇也去面试了,不得不说,现在面试,各种底层各种原理,层出不穷,小勇就遇上了这么一道面试题, ...
随机推荐
- 数据库技术丨GaussDB(DWS)数据同步状态查看方法
摘要:针对数据同步状态查看方法,GaussDB(DWS)提供了丰富的系统函数.视图.工具等可以直观地对同步进度进行跟踪,尤其是为方便定位人员使用,gs_ctl工具已集合了大部分相关系统函数的调用,可做 ...
- VS Code摸鱼神器,让你快速开发AI模型
摘要:ModelArts VS Code插件一键接入云上开发环境介绍及操作指导 对于习惯于使用本地VS Code IDE的开发者,受限于本地资源,采用本地开发加云上调测的远程开发方式不失为一种更好的选 ...
- STM32+华为云IOT制作酒驾监控系统:上车就监控
摘要:设计一种安装在驾驶室内,能根据具体功能进行鉴别酒精浓度的系统,一起监督行车安全. 本文分享自华为云社区<基于STM32+华为云IOT设计的酒驾监控系统[玩转华为云]>,作者: DS小 ...
- Linux IPTables:如何添加防火墙规则
摘要:本文介绍了如何使用"iptables -A"命令添加 iptables 防火墙规则. 本文分享自华为云社区<Linux IPTables:如何添加防火墙规则(使用允许 ...
- 新变化新营销 这些知识点你得 Get!(文末有 PPT 福利首次放送)
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 在刚刚结束的第 7 期火山引擎数智平台 VeDI「增长课堂」上,火山引擎数智平台 VeDI 零售行业解决方案. ...
- IDC《中国边缘云市场解读 (2022)》:阿里云蝉联中国公有云市场第一
国际权威咨询公司IDC发布<中国边缘云市场解读(2022 )>报告,中国边缘公有云服务市场,阿里云蝉联第一. 市场蝉联第一,"边缘"生长强劲 近期,全球领先的IT市场研 ...
- 获取标准报表CJI3的ALV数据
1.CJI3 运行标准程序CJI3,获取对象和业务货币值,在其他程序中展示 2.代码展示 CJI3对应程序名rkpep003,最终展示的ALV结构可以再程序中找到. 因为本实例只获取其中两个字段的值, ...
- Linux 安装Jupyter notebook 并开启远程访问
一. Ubuntu下安装jupyter notebook 1. 使用Anaconda安装 conda install jupyter notebook 2. 使用pip安装 pip install j ...
- L2-014 列车调度 (25 分)(set容器应用)
L2-014 列车调度 (25 分) 火车站的列车调度铁轨的结构如下图所示. 两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道.每趟列车从入口可以选择任意 ...
- 为什么我要迁移SpringBoot到函数计算
前言 为什么要迁移? 我们的业务有很多对外提供服务的 RESTful API,并且要执行很多不同的任务,例如同步连锁 ERP 中的商品信息到美团/饿了么等平台,在线开发票等.由于各种 API 和任务执 ...