java slot_LocalVariableTable之 Slot 复用
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 复用相关推荐
- java socket 重连复用,20190818 On Java8 第八章 复用
第八章 复用 组合语法 初始化引用有四种方法: 当对象被定义时.这意味着它们总是在调用构造函数之前初始化. 在该类的构造函数中. 在实际使用对象之前.这通常称为延迟初始化.在对象创建开销大且不需要每次 ...
- java怎么缓存行填充_为什么java的Exchanger.Slot缓存行填充像这样?
当我在 java中阅读'虚假共享'机制时,我在java.util.concurrent.Exchanger.Slot中找到以下代码 /** * A Slot is an AtomicReference ...
- java 中组合与复用_Java 代码复用(组合与继承)
java中的类都是围绕着类进行的.可以通过创建新类来复用代码,而不必从头编写.可以使用别人已经开发并调试好的类.此方法使用的窍门在于使用类而不破坏现有的程序代码.达到这一目的的方法有两种: 第一种方法 ...
- java socket 重连复用_Java Socket编程基础及深入讲解(示例代码)
Socket是Java网络编程的基础,了解还是有好处的, 这篇文章主要讲解Socket的基础编程.Socket用在哪呢,主要用在进程间,网络间通信.本篇比较长,特别做了个目录: 一.Socket通信基 ...
- java组合语法_JAVA复用类之组合语法的使用(附源码)
复用代码是Java众多引人注目的功能之一.但是要想成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情. 上述方法常为C这类过程型语言所使用,但收效并不是很好.正如J ...
- Java基础学习——代码复用
1.什么是复用 复用指的是代码的复用,即将编写的类通过组合或继承的方式重新利用 2.复用的方式 组合(has-a 关系) 继承(is-a 关系) 3.组合 1.什么是组合? 在新类中引入现有的类,组合 ...
- java继承----类的复用
复用类 类的复用主要有以下的三种方式:组合.继承.代理 一.组合: 将现有类型作为新类型底层实现的一部分来复用.在新类中声明要复用的对象的引用.组合技术通常用于在新类中使用现有类的功能而非它的接口.& ...
- java 中组合与复用_可复用性和组合
可复用性和组合就是将组件可复用性的使用和组合这个组件. 可复用性和组合 我们可以新建一个index.html和index.js,在index.html中引入index.js,然后在index.html ...
- java中的io复用_从 Java 中的零拷贝到五种IO模型
在之前的文章中,我们聊过了 Java 中的零拷贝,零拷贝就是指数据不会在内核空间和用户空间之间相互拷贝.这样就减少了内核态与用户态的切换,自然就很高效. 拷贝文件只是 IO 操作中一个特殊的情况,大多 ...
最新文章
- Java 工程师必须掌握的 JVM 类加载机制!
- 测试TI高速MOS驱动芯片 TPS28225 伴随着MOS半桥
- 面向对象的C语言开发框架:Nesty
- (简单)华为荣耀4A SCL-TL00的usb调试模式在哪里打开的方法
- [Java基础]字节,字符打印流
- 分分钟甩Word几条街,Python编辑公式竟可以如此简单,赶紧收藏!!
- python步长为负时的情况
- TensorFlow新功能「AutoGraph」:将Python转换为计算图
- python学生信息管理系统课程设计报告_学生信息管理系统课程设计报告
- 如何用安卓手机运行Python代码
- 安装Lr11.0(LoadRunner) 出现安装LoadRunner时出现:缺少vc2005_sp1_with_atl_fix_redist的解决办法
- 高数 | 【定积分、变限积分】【一元函数积分学李林880】 及 巧解例题
- 计算机主机结构和名称图,计算机结构图
- 花了1晚上diy的matlab解数独算法,很好理解!
- 使用Telnet 命令行发信
- 应用ArcGIS和COORD软件进行坐标七参数转换的方法
- 程序员因加班错失77万年会大奖,该不该补发?-千氪
- Colossal-AI 分布式人工智能框架
- 计算机测试的论文,软件测试毕业论文-软件工程论文-计算机论文.docx
- 腾讯通RTX无法正常拉取组织架构的解决方法
热门文章
- 北航计算机学院博士机试考试题,北航2015考博真题回忆及全套资料 - 考博 - 小木虫 - 学术 科研 互动社区...
- python图形界面库哪个好_8个必备的Python GUI库
- sdr 软件_【火腿专题】购买软件定义无线电(SDR)还是传统无线电台?追求欲望无止境...
- 数据库范式5nf_第四范式(4NF)| 数据库管理系统
- 清除元素中的子元素html_HTML中的元素简介
- Redis 键值过期操作
- OpenCV环境搭建(一)
- 华为交换机S3700端口基本配置
- Docker Consul 安装及使用服务发现
- 启动成功浏览器显示不了_移动端利用chrome浏览器在PC端进行调试方法