局部变量表是java中栈帧的组成之一,用来存放入参和方法内的局部变量,局部变量表是一个数组,数组中每个元素至少占用4个字节(这与虚拟机规范有关,因为虚拟机规范要求虚拟机的字不少于32位),本文假设是在32位操作系统的hotspot虚拟机,所以局部变量表是一个每个元素4或者8字节的数组,长度不定,因为长度取决于方法的大小,如果方法太长,那么压栈帧的时候,这个局部变量表会很大,反之会很小,假设代码如下

public class MyClass {public static int m1(int a,long b,float c,double d,Object e,byte f) {int x=6;int y=7;int z=x+y;return z;}public int m2(char a,int b,boolean c) {return 0;}
}

对于方法m1,它的局部变量表是这个样子的,这些初始值是调用m1方法的那个方法,从自己的栈中弹出,放到m1的局部变量表中的,当执行x=6的时候,会执行bipush 6指令,将6从m1局部变量表中拿出来,然后入栈,接下来执行istore 8指令将6放到第8个位置,y=7同理,接下执行iload指令两次,将6和7入栈,执行add指令,对栈顶两个数相加,放到第10个位置,最后返回,从下图可以看出f占用了4个字节,而参数是byte类型,为了字节对齐,局部变量表使用最小单位是字,所以会将byte转成4个字节存储,如下图

对于方法m2,它的局部变量表多出来一个this指针(与C++完全相同),这是调用m2的那个方法,从自己的栈中弹出来的,然后放到m2的局部变量表中,根据规范,必须以字为单位,所以char和boolean也是按照4字节来存储在局部变量区的,m2的局部变量表如下图

继续看下面的代码

1.m3调用m4之前,m3会将4和5放到自己的操作数栈
2.m3从自己的操作数栈中弹出,再放到m4栈帧中的局部变量表的1和2的位置(0位置被this引用占据)
3.m4执行的时候,从自己的局部变量表1和2的位置加载(iload)4和5到自己的操作数栈
4.m4执行完毕之后,将返回值压到m3的操作数栈

public int m3() {int a=4;int b=5;int c=m4(a,b);return c;
}
public int m4(int a,int b) {return a+b;
}

注:除iinc指令之外,要想操作局部变量表中的数据,必须得通过栈才能修改局部变量表的值

局部变量表相关属性
locals:表示局部变量表占据多少个元素(字,每个字4字节),例如locals 5,则表示占据20个字节(32位hotspot下)

Java-虚拟机-局部变量表相关推荐

  1. 【Java 虚拟机原理】Class 字节码二进制文件分析 七 ( 局部变量表分析 )

    文章目录 前言 一.编译生成带局部变量表的字节码文件 二.局部变量表 前言 上一篇博客 [Java 虚拟机原理]Class 字节码二进制文件分析 二 ( 常量池位置 | 常量池结构 | tag | i ...

  2. 【Java 虚拟机原理】栈帧 | 局部变量表 | 操作数栈 | 方法出口 | JVM 指令逐条解析

    文章目录 前言 一.JVM 指令逐条解析 1.Java 代码 2.Java 虚拟机指令 3.分析 JVM 指令 4.局部变量表 与 操作数栈 二.方法出口 前言 " 栈帧 " 中存 ...

  3. 【Java 虚拟机原理】线程栈 | 栈帧 | 局部变量表 | 反汇编字节码文件 | Java 虚拟机指令手册 | 程序计数器

    文章目录 一.线程栈 二.栈帧 三.栈帧 - 局部变量表 四.反汇编字节码文件 五.Java 虚拟机指令手册 六.程序计数器 一.线程栈 装载 HelloWorld.class 字节码文件到 Java ...

  4. 深入理解Java虚拟机——运行时栈帧结构(局部变量表)

    目录 一.局部变量表的概述 二.reference类型的概述 三.renturnAddress类型的概述 四.局部变量表中Slot槽复用对垃圾回收的影响 4.1.局部变量表中Slot槽复用对垃圾回收的 ...

  5. Java #JVM(HotSpot) 运行时数据区 #程序计数器(PC寄存器)#虚拟机栈(栈帧:局部变量表、操作数栈……)#堆……

    目录 JVM中线程的说明 程序计数器(PC寄存器) 虚拟机栈 · 栈帧 ·· 局部变量表 ·· 操作数栈 ·· 动态链接 ·· 方法返回地址 ·· 本地方法栈 堆 · 查看堆的大小 · 堆的默认大小 ...

  6. java虚拟机 函数表_java虚拟机 jvm 局部变量表实战

    java局部变量表是栈帧重要组中部分之一.他主要保存函数的参数以及局部的变量信息.局部变量表中的变量作用域是当前调用的函数.函数调用结束后,随着函数栈帧的销毁.局部变量表也会随之销毁,释放空间. 由于 ...

  7. 【Java 虚拟机原理】Class 字节码二进制文件分析 六 ( 属性类型 | Code 属性 | 属性名称索引 | 属性长度 | 操作数栈最大深度 | 局部变量存储空间 | 字节码长度 )

    文章目录 前言 一.属性类型 二.Code 属性表数据结构 三.属性名称索引 四.属性长度 五.操作数栈最大深度 六.局部变量存储空间 七.字节码长度 八.存储字节码指令的一系列字节流 前言 上一篇博 ...

  8. Java虚拟机常量池和本地变量表、自己定义的数值自动装入常量池

    从此文可以大体了解, https://blog.csdn.net/bcbobo21cn/article/details/109108970 自己的程序中定义的数值,像 int a=999; ,这样的, ...

  9. 11.JDK8内存模型、本地方法栈、虚拟机栈、栈帧结构(局部变量表、操作数栈、方法出口、虚拟机栈与本地方法栈的关系、寄存器、方法区、堆(Heap)、jvm中的常量池、Metaspace(元空间))

    11.JDK8内存模型 11.1.本地方法栈(Native Method Stacks) 11.2.虚拟机栈(Java Virtual Machine Stacks) 11.3.栈帧结构 11.3.1 ...

  10. JVM学习笔记之-运行时数据区概述及线程概述,程序计数器(PC寄存器),虚拟机栈(栈,局部变量表,操作数栈,动态连接,方法调用,方法返回地址等),本地方法接口,本地方法栈

    运行时数据区概述及线程概述 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JV ...

最新文章

  1. 【Linux 内核】Linux 内核体系架构 ( 进程调度 | 内存管理 | 中断管理 | 设备管理 | 文件系统 )
  2. 短视频风口创业不容易,您信吗?
  3. 精确控制div的高度
  4. Selenium 控制浏览器
  5. java 高并发mqtt服务器_Boomer 实战压测 mqtt,2w 并发轻松实现
  6. 算法:冒泡排序、一阶滤波
  7. 3.excel 生成 sql
  8. u盘镜像制作linux系统,制作iso镜像U盘自动化安装linux系统
  9. access链接 mysql数据库教程_JDBC连接ACCESS数据库的三种方法
  10. Web前端性能优化——CSS优化
  11. attachEvent时间监听方式
  12. 从电视购物到抖音,流量平台与骗子斗了20年
  13. keepalived 中关于 weight 和 preempt_delay 的实验
  14. mac清理软件哪个好用?五大Mac Cleaner介绍推荐
  15. html 滑屏 效果,HTML5 web app实现手动页面滑屏效果
  16. 初学者c语言心里测试小项目
  17. 产品经理-Axure原型设计-共享停车app
  18. 百度发展史,百度发展历程
  19. springboot+maven+jwt学生信息增删查改
  20. 波兰式与逆波兰式的转换和表达式求值

热门文章

  1. Fence Repair (二叉树求解)(优先队列,先取出小的)
  2. 波特率、信息传输速率与带宽的关系
  3. php 读取文件的所有图片格式,扣丁学堂PHP培训简述PHP如何读取文件夹下所有图片、文件-php文件...
  4. JWT实现Token认证
  5. 【电脑帮助】解决Wind10系统没有本地用户和组的问题
  6. Linux kms 模式设置,linux – 使用KMS设置控制台视频分辨率
  7. mysql中用户线程作用,mysql用户线程的建立与用户线程的状态源码解析
  8. 怎么看铜皮属性_阻抗匹配怎么做 及阻抗匹配的作用。
  9. 程序包sun.misc不存在
  10. linux安装配置CONFIGURE、make 、make install详解