LocalVariableTable中的 Slot, 是存在复用现象的,这个我早就知道,但是,不太清楚是如何复用的。

Java语言规范与JVM规范都没有对Java语言具体要如何使用JVM的局部变量slot做太多限制,只是规定了参数要从下标为0开始的局部变量区传递而已。作用域不重叠的局部变量之间是否一定要复用局部变量区的slot,这纯粹是实现细节——复用也可以,不复用也完全符合规范。所以这种事情只能针对某个具体实现来讨论。假如题主是用Oracle/Sun JDK或者OpenJDK,那么用JDK自带的javap工具来看看不同样子的源码生成怎样的字节码就可以感受到差别了。

在Oracle/Sun JDK与OpenJDK里的javac实现,分配局部变量slot的方式非常死板,纯粹看几个因素:

声明顺序:先到先得;

作用域:进入作用域时抢最靠前得坑,一离开作用域就放开这个坑,让后面的作用域的变量可以占坑;

类型:long与double占俩相邻slot,其它类型占一个slot。

我用的Java版本是Hotspot ,如下,也是有这样的现象的。

java version "1.8.0_131"

Java(TM) SE Runtime Environment (build 1.8.0_131-b11)

Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

一个关键点是作用域,什么是java中变量的作用域?它范围是,从定义变量的那一行开始,到对应的代码块结束的那一行。那么什么是代码块呢? 包含它的花括号的整个部分就是 一个代码块。

看一个例子,如下的代码:

private static void test1() throwsIllegalAccessException, InvocationTargetException, NoSuchMethodException {for (int i = 0; i < 3; i++) {int ia = 1;long long1 = 2;int ib = 3;long long2 = 555;

System.out.println(" over = ");

}

ArrayList array=new ArrayList();

array.add(1);for (int i=0;i

System.out.println(array.get(i));

Integer ia=array.get(i);

Integer ib=array.get(i);

System.out.println(ia);

}//int i = ia + ib;

}

javap得到的字节码是:

LocalVariableTable:

Start Length Slot Name Signature9 20 1 ia I13 16 2 long1 J16 13 4ib I21 8 5long2 J2 33 0i I82 16 2 ia Ljava/lang/Integer;91 7 3 ib Ljava/lang/Integer;54 50 1i I43 62 0 array Ljava/util/ArrayList;

Slot 值出现了重复的0,1,2... ,可见,Slot就是出现了复用。Slot的占用是按照变量在源码出现的顺序来的。 不过,奇怪的是,从上面的信息看来,Slot并不是按字节码信息LocalVariableTable表的顺序来的,Start,Length,Name,Signature都不是的。 ia占用1个slot,long1是2个(尽管long1的起始的slot还是2,但是我们从ib 的起始slot可以推测),long2 起始的slot是5,那么它占用了几个slot呢?从上面的字节码信息,我们并看不出上面东西呢,我们只能根据经验推测, 经验就是

long与double占俩相邻slot,其它类型占一个slot

如果非要看到long2 占用了几个slot,那么就需要再在其对应的作用域中long2 后面创建另外的变量,那么然后就可以通过它后面的变量的起始slot 推测了。

另外,我测试的时候,发现如果变量定义的位置是作用域最后一行的话,也就是说如果定义了变量,后面没有其他代码了,那么它是不会出现在LocalVariableTable表中的。为什么会这样?我想是因为这个时候它就完全无用了吧。如果要让它出现在LocalVariableTable表中,那么只要在其后面随便写点什么代码就好了!

需要注意的是,如果我们的方法,整个就一个作用域,是不会出现slot复用的,因为无法复用啊,一个方法什么情况会出现多个作用域呢? 其实很简单,一个while循环,或者for,或者if.. else,或者switch等等, 还有就是单单一个 花括号 包围也可以。

参考:

https://www.zhihu.com/question/41694588

java slot_LocalVariableTable之 Slot 复用相关推荐

  1. java socket 重连复用,20190818 On Java8 第八章 复用

    第八章 复用 组合语法 初始化引用有四种方法: 当对象被定义时.这意味着它们总是在调用构造函数之前初始化. 在该类的构造函数中. 在实际使用对象之前.这通常称为延迟初始化.在对象创建开销大且不需要每次 ...

  2. java怎么缓存行填充_为什么java的Exchanger.Slot缓存行填充像这样?

    当我在 java中阅读'虚假共享'机制时,我在java.util.concurrent.Exchanger.Slot中找到以下代码 /** * A Slot is an AtomicReference ...

  3. java 中组合与复用_Java 代码复用(组合与继承)

    java中的类都是围绕着类进行的.可以通过创建新类来复用代码,而不必从头编写.可以使用别人已经开发并调试好的类.此方法使用的窍门在于使用类而不破坏现有的程序代码.达到这一目的的方法有两种: 第一种方法 ...

  4. java socket 重连复用_Java Socket编程基础及深入讲解(示例代码)

    Socket是Java网络编程的基础,了解还是有好处的, 这篇文章主要讲解Socket的基础编程.Socket用在哪呢,主要用在进程间,网络间通信.本篇比较长,特别做了个目录: 一.Socket通信基 ...

  5. java组合语法_JAVA复用类之组合语法的使用(附源码)

    复用代码是Java众多引人注目的功能之一.但是要想成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情. 上述方法常为C这类过程型语言所使用,但收效并不是很好.正如J ...

  6. Java基础学习——代码复用

    1.什么是复用 复用指的是代码的复用,即将编写的类通过组合或继承的方式重新利用 2.复用的方式 组合(has-a 关系) 继承(is-a 关系) 3.组合 1.什么是组合? 在新类中引入现有的类,组合 ...

  7. java继承----类的复用

    复用类 类的复用主要有以下的三种方式:组合.继承.代理 一.组合: 将现有类型作为新类型底层实现的一部分来复用.在新类中声明要复用的对象的引用.组合技术通常用于在新类中使用现有类的功能而非它的接口.& ...

  8. java 中组合与复用_可复用性和组合

    可复用性和组合就是将组件可复用性的使用和组合这个组件. 可复用性和组合 我们可以新建一个index.html和index.js,在index.html中引入index.js,然后在index.html ...

  9. java中的io复用_从 Java 中的零拷贝到五种IO模型

    在之前的文章中,我们聊过了 Java 中的零拷贝,零拷贝就是指数据不会在内核空间和用户空间之间相互拷贝.这样就减少了内核态与用户态的切换,自然就很高效. 拷贝文件只是 IO 操作中一个特殊的情况,大多 ...

最新文章

  1. Java 工程师必须掌握的 JVM 类加载机制!
  2. 测试TI高速MOS驱动芯片 TPS28225 伴随着MOS半桥
  3. 面向对象的C语言开发框架:Nesty
  4. (简单)华为荣耀4A SCL-TL00的usb调试模式在哪里打开的方法
  5. [Java基础]字节,字符打印流
  6. 分分钟甩Word几条街,Python编辑公式竟可以如此简单,赶紧收藏!!
  7. python步长为负时的情况
  8. TensorFlow新功能「AutoGraph」:将Python转换为计算图
  9. python学生信息管理系统课程设计报告_学生信息管理系统课程设计报告
  10. 如何用安卓手机运行Python代码
  11. 安装Lr11.0(LoadRunner) 出现安装LoadRunner时出现:缺少vc2005_sp1_with_atl_fix_redist的解决办法
  12. 高数 | 【定积分、变限积分】【一元函数积分学李林880】 及 巧解例题
  13. 计算机主机结构和名称图,计算机结构图
  14. 花了1晚上diy的matlab解数独算法,很好理解!
  15. 使用Telnet 命令行发信
  16. 应用ArcGIS和COORD软件进行坐标七参数转换的方法
  17. 程序员因加班错失77万年会大奖,该不该补发?-千氪
  18. Colossal-AI 分布式人工智能框架
  19. 计算机测试的论文,软件测试毕业论文-软件工程论文-计算机论文.docx
  20. 腾讯通RTX无法正常拉取组织架构的解决方法

热门文章

  1. 北航计算机学院博士机试考试题,北航2015考博真题回忆及全套资料 - 考博 - 小木虫 - 学术 科研 互动社区...
  2. python图形界面库哪个好_8个必备的Python GUI库
  3. sdr 软件_【火腿专题】购买软件定义无线电(SDR)还是传统无线电台?追求欲望无止境...
  4. 数据库范式5nf_第四范式(4NF)| 数据库管理系统
  5. 清除元素中的子元素html_HTML中的元素简介
  6. Redis 键值过期操作
  7. OpenCV环境搭建(一)
  8. 华为交换机S3700端口基本配置
  9. Docker Consul 安装及使用服务发现
  10. 启动成功浏览器显示不了_移动端利用chrome浏览器在PC端进行调试方法