Oracle最新的Java 8更新破坏了您的工具-它是如何发生的?

断裂
如果您最近一直在关注Java世界的消息,那么您可能听说过Oracle发布的最新Java 8构建,Java 8u11(和Java 7u65)引入了错误并破坏了一些流行的第三方工具,例如ZeroTurnaround的JRebel,Javassist,Google的Guice甚至Groovy本身。

JVM产生的错误是漫长而冗长的,但从本质上讲,它们看起来像这样:

Exception in thread "main" java.lang.VerifyError: Bad method call from inside of a branch
Exception Details:Location:com/takipi/tests/dc/DepthCounter.()V @10: invokespecial…

这些错误突然开始出现的原因是由于最新更新中的字节码验证程序比以前的版本更加严格。 与以前的版本不同,它不允许在分支代码中调用超级构造函数。

让我们分解一下。

Java字节码和字节码验证程序

字节码是JVM实际执行的中间语言,并且编写编译的.class文件。 JVM的机器代码(如果需要)。

通过Java,通过Scala,Groovy,Clojure等将所有基于JVM的语言编译成字节码。 JVM不知道也不在乎源语言是什么-它只知道字节码。

我不打算讨论字节码的工作原理 ,因为它是一个主题(或一个或多个帖子),但仅是要了解一下字节码的样子,以这种简单的Java方法为例:

int add(int x, int y) {int z = x + y;return z;
}

编译后,其字节码如下所示:

ILOAD x
ILOAD y
IADD
ISTORE z
ILOAD z
IRETURN

当JVM将类文件从类路径加载到内存中时,它首先必须确保字节码有效并且代码结构正确。 它基本上检查正在加载的代码是否可以实际执行。 如果字节码正确,则该类已成功加载到内存中; 否则,将引发VerifyError ,就像帖子开头的错误一样。

此过程称为字节码验证,而负责该过程的JVM部分是字节码验证程序。

为什么会破裂?

为了使字节码通过验证,它必须遵守类文件格式规范中定义的一组规则。 由于JVM最初是考虑到Java编程语言而设计的,因此许多规则都是直接从Java规则和约束派生的。

Java语言中这样一个众所周知的约束是,在执行其他任何操作之前,必须在构造函数中首先要做的是调用super(…)this(…) 。 之前的任何一段代码-您的代码都不会编译。 即使您没有显式编写super() ,编译器也会在构造函数的最开始为您隐式地插入它。

字节码验证规则中至少在纸面上存在相同的约束。 但是,事实证明,直到这些最新的JDK更新,此约束才得以完全实施。 这意味着,尽管没有Java编译器会允许您编译此代码:

public static class ClassyClass {public ClassyClass() {if (checkSomething()) {super();} else {super(getSomething());}}
}

…等效的字节码将通过验证!

ALOAD thisINVOKESTATIC checkSomething() : booleanIFEQ L2INVOKESPECIAL super() : voidGOTO L2
L1: INVOKESTATIC getSomething() : intINVOKESPECIAL super(int) : void
L2: RETURN

您可以在上面的简化字节码中看到,在第一次调用超构造函数( INVOKESPECIAL )之前,既有一个调用( INVOKESTATIC ),也有一个分支( IFEQ —“如果相等”)。

请记住,尽管以上代码不是合法的Java,因此没有Java编译器会生成等效的字节码-还有许多其他可能的工具,例如不遵循Java约束的其他JVM语言的编译器,以及许多其他工具,例如字节码检测库。 在调用super之前执行代码的功能非常有用!

但是,Java 8 update 11带来了更严格的字节码验证程序,该验证程序拒绝在字节码中使用此类构造的类,并导致引发验证错误和JVM崩溃。

一方面,新的验证程序忠于该规范,从而确保我们的JVM免受不良代码的侵害。 另一方面,许多利用字节码检测的工具,例如调试器和Aspect Weavers(AOP),通常都使用上述结构。

怎么解决呢?

字节码验证程序的修复程序已提交 ,但尚未发布。 但是,许多受影响的工具和项目已经发布了固定版本和解决方法。

同时,如果您碰巧遇到这些错误之一,则可以尝试使用-noverify命令行参数启动JVM。 此选项指示JVM在加载类时跳过字节码验证。

翻译自: https://www.javacodegeeks.com/2014/08/oracles-latest-java-8-update-broke-your-tools-how-did-it-happen.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362702.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么选择Dojo - 记Dojo中文博客正式开张

公告栏里写到:Dojo的高门槛一旦跨过,必将别无所求。含义有二:第一,Dojo难学;第二,Dojo很强大。 这也揭示了本博客的目标:帮助大家用好Dojo这个优秀的Ajax框架。 在回答为什么选择Dojo之前&#…

ExtJS 4.2 第一个程序

本篇介绍如何创建一个ExtJS应用程序。并通过创建目录、导入文件、编写代码及分析代码等步骤来解释第一个ExtJS程序。 目录 1. 创建程序 1.1 创建目录建议 1.2 实际目录 1.3 index.html 1.4 运行图 2. 代码分析 2.1 Ext.onReady() 2.2 Ext.create() 1. 创建程序 1.1 创建目录…

ZooKeeper,策展人以及微服务负载平衡的工作方式

Zookeeper如何确保每位工人都能愉快地从工作委托经理那里得到一些工作。 Apache ZooKeeper是注册,管理和发现在不同计算机上运行的服务的工具。 当我们必须处理具有许多节点的分布式系统时,它是技术堆栈中必不可少的成员,这些节点需要知道其…

elementUI清空弹框中的表单数据

点击此处直达应用场景示例 官网&#xff1a;https://element.eleme.cn/#/zh-CN/component/form 补充&#xff1a;改变表头颜色&#xff1a; <el-table :data"tableData" border style"width: 100%" :header-cell-style"{background:#d3dce6,col…

.Net4.0 Parallel编程(三)Data Parallelism下

在上篇文章中介绍了如何Break、Stop循环&#xff0c;以及如何定义线程局部变量。在本文中介绍如何在外部去取消循环、以及异常的处理。 Cancel 在并行的循环中支持通过传递ParallelOptions参数中的CancellationToken进行取消循环的控制&#xff0c;我们可以CancellationTokenSo…

根据可视窗口判断面板向上还是向下展开

本demo以element-ui框架为视图模板~ HTML代码 JS代码 CSS代码 转载于:https://www.cnblogs.com/dreamsqin/p/10885502.html

编写JUnit测试的另一种方法(Jasmine方法)

最近&#xff0c;我为一个小型个人项目编写了很多Jasmine测试。 我花了一些时间才终于感到正确地完成了测试。 此后&#xff0c;当我切换回JUnit测试时&#xff0c;我总是很难过。 出于某种原因&#xff0c;JUnit测试不再那么好&#xff0c;我想知道是否有可能以类似于Jasmine的…

解决vue项目在ie浏览器中不显示的问题

安装 “babel-polyfill” npm install babel-polyfill --save-dev 或者 cnpm install babel-polyfill --save-dev在入口 main.js 文件引入&#xff1a;import babel-polyfill在 build 文件下的 webpack.base.conf.js 文件中修改代码&#xff1a; entry: {app: ["babel-p…

清空表单时出现问题

打开页面时报警告&#xff1a; 解决办法&#xff1a; &#xff08;1&#xff09;npm i default-passive-events -S &#xff08;2&#xff09;main.js中加入&#xff1a;import ‘default-passive-events’ 参考&#xff1a;https://www.jianshu.com/p/23850d4cade8 出现原…

如何在JSF中实现自定义密码强度指示器

使用JavaScript验证密码强度是一项常见任务。 在本文中&#xff0c;我将展示如何向基于JSF的Web应用程序添加密码强度指示器。 的 PrimeFaces中的密码组件已经具有密码强度的反馈指示符&#xff0c;但是它有两个主要缺点&#xff1a; 反馈指示器没有响应&#xff08;固定宽度…

关于vue打包的问题

一、vue-cli2 二、vue-cli3 一、vue-cli2 错误提示&#xff1a; npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! hewelry1.0.0 build: node build/build.js npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the hewelry1.0.0 build script. npm ERR! This is prob…

html笔记(一)html4+css2.0、css基础和属性、盒模型

w3c 官网 这里是 html4 的内容 大标题小节一、关于HTML1. 基本语法2. HTML常用标签3. 相对路径和绝对路径二、css基础1. 表单元素2. 创建样式表3. css语法4. css选择器三、css的相关属性1. 列表 li 独有的属性list-style2. 边框属性border3. overflow4. 浮动 float 遇到的坑5.…

返回顶部小火箭

代码如下&#xff1a; <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title></title><style>body {width: 2000px;}.top{position: fixed;right:50px;bottom:100px;display: none;}</style&…

最佳5本Java性能调优书籍–精选,必读

为什么Java开发人员应该阅读有关性能调优的书&#xff1f; 当我很久以前第一次面对这个问题时&#xff0c;我以为以后会做&#xff0c;但是我很长一段时间都没有回过头来。 仅当我在用Java编写的任务关键型服务器端财务应用程序中遇到严重的性能和可伸缩性问题时&#xff0c;我…

html笔记(三)html5+css3(html5、css3、文字相关)

W3school在线教程 html5css3基本不兼容ie678。 大标题小节一、html51. html4 和 html5 的区别2. 标签语义化3. 智能表单的使用和规范二、css3选择器1. 属性选择器2. 结构性伪类选择器&#xff08;层级选择器/符&#xff09;3. UI状态性伪类选择器4. 相邻兄弟选择器5. 其他选择…

美登杯 E、小花梨的数组* 线段树

操作过程中标记传递 询问的时候再计算 #include<bits/stdc.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i(a);i<(b);i) #define repp(i,a,b) for(int i(a);i>(b);--i) #define RI(n) scanf("%d",&(n)) #define RII(n,m) sc…

怎么得到scrollTop

我们学习一个事件 &#xff1a; 页面滚动效果 window.onscroll function() { 页面滚动语句 } 谷歌浏览器 和没有声明 DTD <DOCTYPE > &#xff1a; document.body.scrollTop; 火狐 和其他浏览器 document.documentElement.scrollTop; ie9 和 最新浏览器…

console.log打印没有效果

今天用谷歌调试的时候&#xff0c;遇到了一个很奇怪的现象&#xff0c;console.log() 完全不出效果&#xff0c;把它放到script下的第一行也没有用。然后借鉴了几个博主的。 直接改 https://blog.csdn.net/wujy_rrycbar2016/article/details/78341973 打开控制台 -> 改为 D…

CSS实战2

1. 鼠标样式 Cursor: pointer 鼠标变成小手 Cursor: default; 小白 Cursor : move; 移动 Cursor : text ; 文本输入 网页布局&#xff1a; 给一个盒子 &#xff1a; 宽度高度 背景 边框 位置 2.border-radius 圆角矩形 border-radius: 7px 7px 7p…