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…

(一)PHP基础知识考察点

1&#xff0c;PHP引用变量的考察点&#xff1a; 概念&#xff1a;引用就是用不同的名字访问同一个变量内容。 定义方式&#xff1a; 使用&符号。 PHP引用变量的工作原理 这里有个COW copy on write 用zval&#xff08;&#xff09;去查看空间占用情况以及引用情况。 unse…

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

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

节点的运用和方法

JQUERY的父&#xff0c;子&#xff0c;兄弟节点查找方法 jQuery.parent(expr) 找父亲节点&#xff0c;可以传入expr进行过滤&#xff0c;比如$("span").parent()或者$("span").parent(".class") jQuery.parents(expr),类似于jQuery.parents(ex…

Java:使用终止信号确定数据导入的状态

几周前&#xff0c;我正在尝试将约6000万位数据最初导入Neo4j&#xff0c;但我们一直遇到一个问题&#xff0c;即导入过程似乎停滞了&#xff0c;什么也没导入。 很难分辨该过程中发生了什么—采取线程转储只是告诉我们它正在尝试处理CSV行中的一行&#xff0c;并且以某种方式…

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

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

关于几本模拟IC设计书

1.P.R.Gray的书  这本书被业界誉为模拟IC的Bible&#xff0c;盛名之下&#xff0c;必无虚士。现在已经出到第四版&#xff0c;作者无一例外是业界大牛&#xff0c;该书论述严谨&#xff0c;思路清晰&#xff0c;对电路分析透彻&#xff0c;定义严格明确&#xff0c;无愧Bible…

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

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

H5 input输入限制最大位数,和调用小键盘需求发生冲突的解决办法

首先&#xff0c;限制输入最大位数时&#xff0c;input有自带的属性maxlength。 <input type"text" name"email" maxlength"55" /> 使用方法&#xff1a;maxlength"位数" 但是&#xff0c;对于这个属性他是有自己的限制条件的 …

解决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…

Spark-Luanch Driver

1.SparkSubmit.scala主要调用M-prepareSubmitEnvironment&#xff0c;该方法更根据用户定义的参数&#xff0c;匹配不同client&#xff0c;去调用不同clientApp。(ps&#xff1a;本次讲ClientApp 也就是standalone)在M-runMain通过 调用M-Utils.classForName 反射的方式调用 …

大风大浪大鱼

一群年轻人常在一泓深潭边钓鱼&#xff0c;而有一个渔夫总是在潭上边水流湍急的河里捕鱼。 年轻人觉得这渔夫可笑&#xff0c;在大风大浪的河里怎么会捕到鱼呢?有一天&#xff0c;年轻人忍不住去问渔夫&#xff1a;“鱼能在这么湍急的地方停留吗?”渔夫说&#xff0c;当然不能…

清空表单时出现问题

打开页面时报警告&#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 出现原…

JQuery Ajax 使用FormData上传文件对象

FormData部分: 先new FormData对象 :let somedata new FormData(),然后将数据添加进去&#xff0c;这里我们使用append()进行添加。 这里举一个上传头像的例子&#xff1a; let token localStorage.token; let img $(".file")..get(0).files[0]; let somedat…

[探索][管理]《现在,发现你的优势》

此书是我迄今为止看过最棒的一本书&#xff01;&#xff01;&#xff01; 为什么这么说&#xff0c;因为就像前言彼得德鲁克所说的一样 -- 大部分的人都不知道他们的优势何在。此书的宗旨就是测试你的优势是什么&#xff0c;并且发展你的优势。为何要去改变你不擅长的东西呢&am…

box2d——1.tiles瓦片积木

【调试渲染】 将TestCpp里Box2DTestBed的GLES-Render.h/cpp加入到项目中。声明绘制变量&#xff1a;GLESDebugDrawmDebugDraw。 【创建世界】 // 依据重力创建世界b2Vec2 gravity;gravity.Set(0.0f, -10.0f);mWorld new b2World(gravity);// 设置调试渲染和碰撞侦听mWorld-&…