【转帖】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)点的工作,这不小勇也去面试了,不得不说,现在面试,各种底层各种原理,层出不穷,小勇就遇上了这么一道面试题, ...
随机推荐
- QT OpenGLWidget高分屏适配时出现的问题
参考官方文档,为了解决4K屏幕显示QT界面时出现窗口变小分辨率不匹配的问题,我们可以在 QApplication a(argc, argv); 这句之前添加: #if (QT_VERSION > ...
- 第三部分_Shell脚本简单四则运算
简单四则运算 算术运算:默认情况下,shell就只能支持简单的整数运算 运算内容:加(+).减(-).乘(*).除(/).求余数(%) 1. 四则运算符号 表达式 举例 $(( )) | echo $ ...
- 带你认识数仓的监控系统TopSQL
本文分享自华为云社区<GaussDB(DWS)TopSQL总结>,作者:nullptr_ . TopSQL 背景 TopSQL为DWS的监控系统,记录DWS中各个作业.算子级别的资源使用数 ...
- 掌握ROMA Compose,报表清单不秃头
摘要:在没有ROMA Compose之前,完成一个跨数据源的关联查询是一个十分艰巨的任务. 1. ROMA Compose为何诞生 试想这样一个场景,主管让刚入职的小沛明天下班前给他发一份报表.小沛兴 ...
- GaussDB CN服务异常实例分析
摘要:先通过OPS确认节点状态是否已经恢复,或登录后台执行cm_ctl query -Cv确认集群是否已经Normal. 本文分享自华为云社区<[实例状态]GaussDB CN服务异常>, ...
- openGemini内核源码正式对外开源
摘要:openGemini是一个开源的分布式时序数据库系统,可广泛应用于物联网.车联网.运维监控.工业互联网等业务场景,具备卓越的读写性能和高效的数据分析能力. 本文分享自华为云社区<华为云面向 ...
- 大力出奇迹,揭秘昇腾CANN的AI超能力
摘要:CANN(Compute Architecture for Neural Networks)异构计算架构,是以提升用户开发效率和释放昇腾AI处理器极致算力为目标,专门面向AI场景的异构计算架构. ...
- 代码混淆工具ipaguard:如何使用ipaguard保护和混淆iOS应用程序代码
转载:怎么保护苹果手机移动应用程序ios ipa文件中的代码? 目录 转载:怎么保护苹果手机移动应用程序ios ipa文件中的代码? 代码混淆步骤 1. 选择要混淆保护的ipa文件 2. 选择要混 ...
- 对话 BitSail Contributor | 姚泽宇:新生火焰,未来亦可燎原
2022 年 10 月,字节跳动 BitSail 数据引擎正式开源.同期,社区推出 Contributor 激励计划第一期,目前已有 12 位开发者为 BitSail 社区做出贡献,成为了首批 Bit ...
- #2051:Bitset(进制转化)
Problem Description Give you a number on base ten,you should output it on base two.(0 < n < 10 ...