unsafehelper java_Java 9中将移除 Sun.misc.Unsafe

灾难将至,Java 9中将移除 Sun.misc.Unsafe

Oracle 正在计划在Java 9中去掉 sun.misc.Unsafe API。 这绝对将是一场灾难,有可能会彻底破坏整个 java 生态圈。 几乎每个使用 java开发的工具、软件基础设施、高性能开发库都在底层使用了 sun.misc.Unsafe。 下面是上面链接中文档提到一个小列表:

Netty

Hazelcast

Cassandra

Mockito / EasyMock / JMock / PowerMock

Scala Specs

Spock

Robolectric

Grails

Neo4j

Spring Framework

Akka

Apache Kafka

Apache Wink

Apache Storm

Apache Hadoop

Apache Continuum

… 这个列表很长。。。

然而, Oracle 看起来是铁了心毫无理由的去掉它。下面是一个来自他们邮件列表的评论: n

恕我直言 — sun.misc.Unsafe 必须死掉。 它是“不安全”的。它必须被废弃。请忽略一切理论上(想象中的)羁绊,从此走上正确的道路吧。

这个工程师似乎是毫无根据的憎恨 Unsafe。。。

Oracle应该怎么做?

当前Unsafe 类是一个强有力的工具。 没有必要去掉它。对这个类的特性有些明确的需求,这就是为什么事实上几乎每个 Java 程序都在使用它,不知不觉中许多流行的 Java库也在使用它。

提供完整的文档、发布 Unsafe 类

Oracle 应该接受现实,并将Unsafe转为公开 API,提供完善的文档和开发示例。 当前,没有准确的文档,开发中需要通过 stackoverflow 帖子或者其他一些随机的博客学习怎么使用 Unsafe。 移除 Unsafe 的一个主要论据是:使用它太容易让开发中犯错了。如果有完善的官方文档或许可以改善这一现状。

随 Unsafe一起发布新的替代 API

除了 Unsafe 文档外,Oracle 应该发布一个更易用的 API,提供 Unsafe 相同的功能。 这是上面文档中的提议的一部分。然而这不太应该以移除 Unsafe 为代价。 人们在开发新软件的时候就会逐步过渡到新的 API,Unsafe 就自动被废弃了。

这类似于向 Java 8引入 java.time 包中的新的 DateTime API。 新的日期 API 的引入并不表示之前的DateTime API 被彻底移除或者隐藏到某个特殊 JVM flag 里。那样也肯定会引发一些事故。

实际上最可能会变成什么样子?

根据事情的发展趋势,Oracle 看起来会:

在 Java 9正常模式下移除 Unsafe 类。

仅在必须的情况下通过向 JVM 传递一个特殊的 flag 启动 Unsafe

这将导致绝对的灾难!

不仅类似 Cassandra 或Zookeeper 等基础软件,几乎所有的 Java 程序,包括 web 应用也会挂掉,因为他们使用的基础库可能在底层使用了 Unsafe。

从此打开 Unsafe flag 将会成为启动 JVM 的默认 flag 之一,因为如果不打开它的话 Java 应用会在毫无提示的情况下崩溃。

因为大多数环境不会默认把这个JVM flag 打开,当他们的系统升级 Java时软件系统会挂掉。 Java 打破了向后兼容的承诺。所有的基础库、软件基础设施从此变为两个版本:

Java 9之前的版本 – 使用 Unsafe

Java 9兼容 – 不使用 Unsafe。

迁移至 Java 9的进程会因此而变缓慢,这将影响整个 Java 生态系统。这将会类似于 Python 2升级到 Python 3的过程。

这种错误 JVM 社区之前曾经犯过

你是不是任务这太荒唐了,Oracle 绝不可能犯这样的错误?事实上它曾做过类似的事情了, 例如Java 7中的字节码校验器。

结论

现在是该让大家开始意识到这个问题的时候了。从 JVM中去掉Unsafe或者把它隐藏在某个特殊的 flag 里面势必导致一场灾难。

参考链接

d0c1501a6d8bb921cf36400dc89de69f.png

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

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

相关文章

python 代码格式规范脚本_Python编码规范

Python自动化测试代码编码规范一、适用范围:本规则基础为Python标准PEP8,在此基础上加了我司测试部编码规范,适用于测试部所有Python脚本编写是采用的规则.二、编码:所有的 Python 脚本文件都应在文件头标上 # -*- coding:utf-8 -…

java 根据类名示例化类_如何使用示例从Java中的类路径加载资源

java 根据类名示例化类Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容。 Java提供了API来将这些资源读取为InputStream或URL。 假设您在项目的config文…

java课程设计进程管理_Java课设总结(个人版)

使用物理引擎JBox2D完成游戏关卡的各个物理状态模拟根据物理引擎设计Bird,Pig,Brick等游戏中出现的可运动刚体类建立JBox2d的工具类以实现###本人对这次课设的看法与吐槽 1.课设内容的脑洞是我在看完17级学长的游戏课设之后想出的 当时还没学java网络编程的内容,误以…

二叉树层次遍历c语言_[LeetCode] 107. 二叉树的层次遍历 II

题目链接 : https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/题目描述:给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如: 给…

使用测微计收集应用程序指标

什么是千分尺? 千分尺是一个简单的外观,用于以供应商中立的方式收集Java应用程序中的指标。 您可以考虑使用SLF4J作为指标。 Micrometer内置了对许多不同指标后端的支持,包括Atlas,Datadog,Elastic,JMX等。…

java鼠标左键按下后拖动实现多选_鼠标拖拽多选功能

鼠标拖拽多选功能*{box-sizing:border-box;}ul{width:500px;height:auto;margin:0;padding:20px;font-size: 0;/*需设置定位*/position:relative;}li{width:70px;height:70px;margin:10px;padding:0;display:inline-block;vertical-align: top;font-size: 13px;border:1px soli…

python epoll多路复用技术_python IO 多路复用 epoll简单模型

IO多路复用就是我们说的select poll epoll通过一种机制使一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,epoll()函数就可以返回。所以,IO多路复用,本质上不会有并发的功能&#…

python3多线程协程_python3-----多进程、多线程、多协程

目前计算机程序一般会遇到两类I/O:硬盘I/O和网络I/O。我就针对网络I/O的场景分析下python3下进程、线程、协程效率的对比。进程采用multiprocessing.Pool进程池,线程是自己封装的进程池,协程采用gevent的库。用python3自带的urlllib.request和…

Apache CXF 3.0:CDI 1.1支持替代Spring

几周前刚刚发布了Apache CXF 3.0 ,该项目又迈出了满足JAX-RS 2.0规范要求的又一个重要步骤:与CDI 1.1集成。 在此博客文章中,我们将看几个有关Apache CXF 3.0和Apache CXF 3.0如何协同工作的示例。 从3.0版开始, Apache CXF包含一…

java varbinary_SQL 中存放 varbinary型数据

使用带有 BULK 选项的 OPENROWSET以下 Transact-SQL 增强功能支持 OPENROWSET(BULK...)函数:与 SELECT 一起使用的 FROM 子句可以调用 OPENROWSET(BULK...)而非表名,同时可以实现完整的 SELECT 功能。带有 BULK 选项的 OPENROWSET 在 FROM 子句中需要有一…

python矩阵左除_matlab学习笔记

Matlab学习笔记运算:1. 算术运算(在矩阵意义下进行):要求矩阵同型,对应元素相加减,如果用标量和矩阵相加减,不同型就凉凉提示错误,那就将矩阵每个元素和数字相加减-:同上*:A*B要求左行右列,…

只读副本和Spring Data第1部分:配置数据库

这是有关我们为利用只读副本来提高应用程序性能而寻求的一系列博客文章。 对于这个项目,我们的目标是建立我们的spring数据应用程序,并使用read仓库进行写操作,并基于read副本进行读操作。 为了模拟这种环境,我们将通过Docker使…

java结构体系_java io结构体系

Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点:1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系2. 原始处理器(适配器)与链接流处理器(装饰器)其结构图如下:Reader-Writer体系1. 基类…

python turtle应用实例_turtle库应用实例2-六芒星的绘制

‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬描述使用turtle库绘制一个六角形,效果如下:‪…

java按钮改变窗口大小_布局似乎有问题,JButton在调整窗口大小时显示出意外的行为。...

很好的例子的问题可能与平台有关,但我可以提供一些观察:您没有添加或删除组件,所以您不需要revalidate().由于背景色是按钮的绑定属性,因此不需要后续调用repaint().你,你们做需要repaint()在你的习惯里DrawingArea&am…

JUnit 5和Selenium –使用Selenium内置的`PageFactory`实现页面对象模式

Selenium是一组支持浏览器自动化的工具和库,主要用于Web应用程序测试。 Selenium的组件之一是Selenium WebDriver,它提供客户端库,JSON有线协议(与浏览器驱动程序进行通信的协议)和浏览器驱动程序。 Selenium WebDrive…

python 配置文件中密码不能是明文_配置文件中明文密码改为密文密码的方法

我们用java链接数据库,不管是web项目还是小程序,都需要把数据库密码写在配置文件中(当然你要写死在程序里也没有办法),或者数据库中,通常源代码漏洞扫描都会告诉你不能有明文密码,那么有什么办法可以变为密文呢&#x…

java.lang 源码剖析_java.lang.Void类源码解析

在一次源码查看ThreadGroup的时候,看到一段代码,为以下:/** throws NullPointerException if the parent argument is {code null}* throws SecurityException if the current thread cannot create a* thread in the specified thread group…

vant按需引入没样式_vue vant-ui样式出不来的问题

第一步:安装vantnpm i vant -S // 或 yarn add vant第二步:配置按需引入// 在 babel.config.js 中配置 module.exports {plugins: [[import, {libraryName: vant,libraryDirectory: es,style: true}, vant]] };第三步:配置vue.config.js&…

javaserver_如何在JavaServer Pages中使用Salesforce REST API

javaserver摘要:本教程提供了一个JSP示例以及如何将其与Salesforce REST API集成。 我们将逐步完成创建外部客户端以使用Force.com (同时使用HTTP(S)和JSON)管理数据的分步过程。 在此示例中,我将Mac OS X…