从字节码指令分析i=i++(i是long类型时)
刚写了个编文章说int i=i++的问题,之后想是iinc指令直接操作本地变量表草成的么,随之用long做了一下实验,看代码和编译后的指令,
public static void iAdd(long i) {i = i++;System.out.println(i);}
变异后的code的第1行的意思是复制栈顶一个(long、double型的)或两个(其它类型的)数值,并且复制值进栈,一直到第2行代码之后,这时候的栈是什么样子的呢?见下图
1 |
1 |
1 |
第三行ladd指令,栈顶两个元素出栈,相加之后入栈
2 |
1 |
紧接着连续两个lstore指令,将栈顶元素存储到相应的本地变量表,弹出2之后本地变量i=2,弹出1之后本地变量i=1;
后面的指令是输出语句的编译之后的指令,只做简单分析,6行获取常量池#3指示的静态域压入栈顶,9行加载本地变量表0出的变量到栈顶;
10行栈顶两个元素出栈,调用#4 字符产量指定的函数。最后一行return。
一些个人看法:
i=i++;之所以会出现 执行完不变的情况,是因为:先用再加,按说先用i=i,再加i++;也不会出现不变的情况,应该是,先用,并不是真正的先用,而是在栈中暂时存储,并没有真正给本地变量表的变量赋值,知道i++结束之后,才将之前放入战中的值弹出赋值。
这是i是long的情况下,去掉i=,之后编译后代码,发现少了一个dup2和lstore,也就是少了先用的入栈,和最后的出栈赋值。
另外安利一个比较不错的文章,里面对变异后的指令均做了介绍,帮助甚大。
JVM指令集(指令码、助记符、功能描述) --- 逐渐更新 --- 2011-08-23
(最后又想起来一点,为什么栈的大小是3,因为所有的出栈入栈操作,栈大小为3即可满足所有的入栈出栈操作,最大时为3)
从字节码指令分析i=i++(i是long类型时)相关推荐
- 操作数栈的字节码指令执行分析
一:写个demo 二:点击Recompile编译 三:使用javap命令反编译class文件 javap -v 类名.class 四:查看结果 五:分析执行过程 首先bipush意思是把 ...
- 你还在为怎么查看字节码指令而担忧吗?
来自:烟雨星空 前言 我们平时编码过程中,可能很少去查看 Java 文件编译后的字节码指令.但是,不管你是因为对技术非常热爱,喜欢刨根问底,还是想在别人面前装X .我认为,都非常有必要了解一下常见的字 ...
- 【Java 虚拟机原理】Class 字节码二进制文件分析 六 ( 属性类型 | Code 属性 | 属性名称索引 | 属性长度 | 操作数栈最大深度 | 局部变量存储空间 | 字节码长度 )
文章目录 前言 一.属性类型 二.Code 属性表数据结构 三.属性名称索引 四.属性长度 五.操作数栈最大深度 六.局部变量存储空间 七.字节码长度 八.存储字节码指令的一系列字节流 前言 上一篇博 ...
- java异常 字节码,Java字节码角度分析异常处理
目录 从字节码角度来分析:异常处理 1.1 异常-catch // 从字节码角度来分析:异常处理 public class T13_ByteAnalyseException { public stat ...
- java字节码指令简介(仅了解)
[0]README 0.1)本文全文转自 "深入理解jvm", 旨在了解 java字节码指令 的基础知识: [1]写在前面 1)由于jvm 采用面向操作数栈而不是寄存器的结构,所以 ...
- JVM004_字节码指令简介
字节码指令简介 Java虚拟机指令由操作码(Opcode)和跟随其后的零至多个操作数(Operand)组成. 操作码:一个字节长度的,代表某种特定操作含义的数字. 操作数:操作码需要的参数. 字节码与 ...
- Class文件结构amp;字节码指令
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_36367789/article/details/81605625 class文件结构 无符号数 ...
- JVM学习-字节码指令
目录 1.入门 2 javap 工具 3 图解方法执行流程 3.1.原始 java 代码 3.2.编译后的字节码文件 3.3.常量池载入运行时常量池 3.4.方法字节码载入方法区 3.5.main 线 ...
- Java字节码角度分析多态原理 ——提升硬实力8
在前面的文章中,有详细地介绍java字节码相关的知识,有兴趣的可以提前了解一下. 1.Java字节码的一段旅行经历--提升硬实力1 2.Java字节码角度分析a++ --提升硬实力2 3.Java字节 ...
最新文章
- php 两个数组求交集_如何求两个数组的交集
- 使用tensorflow实现全连接神经网络的简单示例,含源码
- Vivado不同版本打开IP核锁定的解决办法
- Ardino基础教程 7_蜂鸣器发声实验
- 实例构造器和类(引用类型)
- java 获取键盘输入法_Java中接收键盘输入的三种方法
- 手机modem开发(1)---MTK modem开发
- 视频版ImageNet?快手搞了一场用户兴趣建模大赛 | 附前三名干货
- java静态类是只有一个吗,一个只有“私有最终静态”变量的java类。这是一个好主意吗?...
- MatConvNet中关于vl_simplenn_display的一些分析
- 简单电脑***《菜鸟级》
- 服务器开机显示密码过期,Windows server提示密码过期 更改密码使用期限方法
- python中pip下载过慢问题
- win10系统pyCharm安装及最新2018激活码
- 10被动语态,双重所有格
- 支持向量机的特点,优点缺点
- 云计算的三种服务模式的讲解
- GPS警用车辆3G视频监控系统方案
- 在线教育:直播视频有哪些运营方式呢?
- 牛客第一场 H XOR —— 线性基