Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么JSR/RET不推荐使用Java字节码?_Java_Jvm_Bytecode_Deprecated_Opcode - Fatal编程技术网

为什么JSR/RET不推荐使用Java字节码?

为什么JSR/RET不推荐使用Java字节码?,java,jvm,bytecode,deprecated,opcode,Java,Jvm,Bytecode,Deprecated,Opcode,有人知道为什么Java6中不推荐使用JSR/RET字节码对吗 我在网上找到的唯一有意义的解释是,它们使得运行时进行的代码分析变得越来越难、越来越慢。有人知道另一个原因吗?JSR和RET使字节码验证变得比其他方式困难得多,因为放松了一些正常的字节码约束(例如在JSR条目上具有一致的堆栈形状)。好处很小(在某些情况下,可能会使用更小的方法),而且验证器在处理奇怪的JSR/RET模式(以及潜在的安全漏洞,以及完整验证的相关运行时成本)方面仍然存在困难,这使得继续使用它不再有用 堆栈映射和由于数据而启用

有人知道为什么Java6中不推荐使用JSR/RET字节码对吗


我在网上找到的唯一有意义的解释是,它们使得运行时进行的代码分析变得越来越难、越来越慢。有人知道另一个原因吗?

JSR和RET使字节码验证变得比其他方式困难得多,因为放松了一些正常的字节码约束(例如在JSR条目上具有一致的堆栈形状)。好处很小(在某些情况下,可能会使用更小的方法),而且验证器在处理奇怪的JSR/RET模式(以及潜在的安全漏洞,以及完整验证的相关运行时成本)方面仍然存在困难,这使得继续使用它不再有用


堆栈映射和由于数据而启用的较轻的验证器在类加载过程中是一个巨大的性能胜利,而不会牺牲安全性。

请注意:安全漏洞不仅是潜在的,在较旧的Java版本中存在验证器缺陷,其中,使用交换字节码交换堆栈上的两个返回地址(JSR/JSR/SWAP/RET漏洞)会导致类型混淆。条目上具有一致的堆栈形状意味着什么?JVM使用堆栈表示操作数。例如:iadd字节码需要堆栈上有2个整数,它会弹出2个整数,然后将这些整数相加的结果推送到一起。因此,保持一致的形状意味着在方法中的任何给定字节码位置,堆栈的深度始终相同,堆栈上的每个元素都是正确的类型(即:int vs reference,等等)。您的意思是JVM不赞成使用它,还是Oracle的Java编译器不再使用它?我在jvms7@CiroSantilli上找不到弃用通知巴拿馬文件六四事件法轮功: 经过大量搜索,我在Java7类(类文件格式51.0)中找到了针对这些指令的规则。这是JVM的一部分。有关详细信息,请参阅。