为什么java字节码“存储”通常后跟“加载”?

前端之家收集整理的这篇文章主要介绍了为什么java字节码“存储”通常后跟“加载”?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当我从一些小的 java函数中读取jvm字节码时,我发现当一个新的局部变量在操作数堆栈上计算时,假设它将存储在局部变量表中,但通常它会立即加载到操作数堆栈中(仅字面上的字节码).我操作不好,是不必要的操作?

解决方法

Java编译器倾向于以非常简单和直接的方式编译事物,从而将优化留给JIT.

例如,如果你写x * = 3; x * = 4;,你可能会得到字节码

iload_1
iconst_3
imul
istore_1
iload_1
iconst_4
imul
istore_1

理论上,编译器可以确定存储/加载对是冗余的并将其删除.但是有几个理由不这样做 – 1)这增加了很多复杂性而没有任何好处,因为JIT无论如何都会优化一切2)它使调试变得更难,因为你不再能够访问所有局部变量的值3)如果在此表达式的中间以某种方式抛出异常,则局部变量将具有不正确的值.

猜你在找的Java相关文章