为什么java字节码“存储”通常后跟“加载”?
发布时间:2020-12-14 23:48:55 所属栏目:Java 来源:网络整理
导读:当我从一些小的 java函数中读取jvm字节码时,我发现当一个新的局部变量在操作数堆栈上计算时,假设它将存储在局部变量表中,但通常它会立即加载到操作数堆栈中(仅字面上的字节码).我操作不好,是不必要的操作? 解决方法 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)如果在此表达式的中间以某种方式抛出异常,则局部变量将具有不正确的值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容