怎敢精——jvm指令小知识点

1、无论是加载还是存储指令,都被分成了两类,一类是不带操作数的iconst_0,iconst_1,一类是代操作数的bipush 0,不带操作数的指令一般限定是对-1-5的数字操作,可以直接调用指令,不需要解析操作数,也不需要为操作数额外留一个空间。而bipush 10相对来说需要额外的操作有:多留存储空间,读取指令时要获取对应操作数,要对操作数进行解析。而iconst_1只需要读取指令然后执行。但是显然jvm虚拟机不会对所有数字都命名一个指令,所以只对 -1到5命名了指令。

2、指令通常操作的都是操作数栈,变量用于临时存储。一般操作是将数据入栈,出栈,处理完结果在入栈。所以在看指令的时候经常看到数据在栈和变量之间传递。iinc除外,他对变量直接操作,其他是操作操作数栈

3、由于使用了load和store指令,开发者尽可能的重用局部变量可以使代码更高效简洁,当前栈帧占据的内存更小

4、最常用的int i = 1;其实做了不是一步而是两步。第一步将1放到操作数栈,第二部将数据存储到第一个本地变量

5、方法的本地变量表的第0个变量一般都是this,但是如果方法是static方法的话,那么没有this,如果在静态里引用this是报错的。

猜你喜欢

转载自blog.csdn.net/a397525088/article/details/81610048