本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接
一 字节码
字节码是java跨平台的利器,无论你写成何种方法,最终java来执行的都是字节码,同时字节码现在也变得越来越被学习者看中,例如多线程,例如解释一些效率的问题。
二 查看字节码
jvm命令:javap -c +执行的class文件
- i++的执行
-
代码
int a =0; int i=0; a = i++; -
字节码
4: iload_2 5: iinc 2, 1 8: istore_1
- ++i的执行
-
代码
int a =0; int i=0; a = ++i; -
字节码
++i 的字节码执行 4: iinc 2, 1 7: iload_2 8: istore_1
二 字节码执行分析
-
解释i++
先将局部变量表中的第二个抽屉中的数据 放入栈,然后再对局部变量表的第二个抽屉进行+1,最后将栈中的数据放入到局部变量表;结果就是0,而区别就是我们最后读取的是栈中的数据,而+1缺失在局部表量表所以才是0;
-
解释++i
首先iinc是对局部变量表中的数据进行 +1操作。那后面的 数值(2,1)是什么意思呢,先说下局部表量表,这个是jvm虚拟机栈中的一个空间,存储的是参数和局部变量,我们可以理解他为一个中药柜,里面有很多的抽屉,(2,1)就是向第二个抽屉中的数据+1
然后iload_2 就是将局部变量表中的第二个变量,放入到操作栈中,也就是入栈,这时栈中的数据就是1了,然后执行istore_1就是将栈顶的数据赋值给局部变量,这时局部变量就是1了
三 结语
其实代码很少,但是解析还是用了一些jvm的知识,如果知识用看的,那么很难去理解其中的操作,但是如果自己实战下,不仅能够理解其中的意思,还能学到一些其他的知识,何乐而不为呢?