大厂Data+Agent 秘籍:腾讯/阿里/字节解析如何提升数据分析智能。 了解详情
写点什么

Java 9 发布在即,Oracle OpenJDK 着手优化 Unsafe 类

  • 2016-05-06
  • 本文字数:1093 字

    阅读完需:约 4 分钟

java 9 正式版预计在 2017 年 2 季度发布,目前大部分 JEP 已经基本成型。其中,最关键特性或许是 JEP 261 , 该 JEP 实现了 java 平台的模块系统, 具体说明可以参见 JSR376 。 模块系统依赖于 JEP260 (封装了大部分内部 API),导致的结果是 JEP193 定义的多个句柄会暴露 sun.misc.Unsafe 类的功能。此前 Info报道过致力于解决sun.misc.Unsafe 句柄问题的团队,可能的解决方案细节亦可参见另一篇报道

Bug 8149159 最近被提交到 JDK Bug 管理系统, 建议优化和清理 Unsafe 类, 包括将参数检查从本地代码移入 Java(简化 JIT)、 sun.misc.Unsafe 类和 jdk.internal.misc.Unsafe 类的统一、 以及本地代码的整体清理。

2 月 18 日,Oracle 工程师 Mikael Vidstedt 向 OpenJDK 开发者社区提交了两个补丁(分别针对 OpenJDK 和 OpenJDK HotSpot VM)

关于这两个补丁,Vidstedt 总结道:

  • 避免代码重复,sun.misc.Unsafe 将全部实现委托给 jdk.internal.misc.Unsafe,这意味着 java 虚拟机 (特别是 unsafe.cpp)不再需要关心 s.m.Unsafe 的实现。
  • s.m.Unsafe 的委托方法通常会被内联,但是为了避免性能下降的风险,仍然添加了 @ForceInline 注解
  • 更新文档,指明用户应该确保 Unsafe 类的参数正确
  • 参数检查从 Unsage.cpp 移入 java,简化本地代码以及允许 JIT 进一步优化
  • 放松了特定参数的检查,比方说最近引入的 U.copySwapMemory 没有检查空指针。具体原因可以参考 j.i.m.U.checkPointer 的文档。除了 U.copySwapMemory,现在 Unsafe 类方法也都没有对参数执行 NULL 检查
  • 在 U.copySwapMemory 类的基础上,对 j.i.m.U.copyMemory 增加了一个测试案例。请随时提醒我合并过来(本该如此)

在 Vidstedt 看来,Usage 类的清理算是“相当激进”了,值得注意的地方有:

  • Unsafe_ 方法以及 unsafe.cpp 中的其他本地方法被申明为静态方法
  • 新增 unsafe.hpp 代码文件,文件中移入 VM 其他组件的一些方法。移除部分“extern”函数声明(不要过度使用 extern)
  • 对于不怎么用到的 UNSAFE_LEAF,移除警告性质的注释(没有必要,只是个 VM_LEAF)
  • 一些简单的 leaf 方法使用 UNSAFE_LEAF
  • UNSAFE_ENTRY/UNSAFE_END 代码块新增大括号,帮助自动缩进
  • 移除未使用的 Unsafe_<…>##140 形式的函数和宏
  • 更新宏参数,与 unsafe.cpp 的宏定义保持一致
  • 更换带断言的参数检查,正如前面提及,这些检查移入了 j.i.m.Unsafe,移除所有 s.m.Unsafe 相关的代码

查看英文原文: Oracle’s OpenJDK Cleanup of “Unsafe” Implementation


感谢张龙对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-05-06 19:003982

评论

发布
暂无评论
发现更多内容

Fabric.js IText 手动设置斜体 🎋

德育处主任

JavaScript 前端 canvas Fabric.js 6月月更

Java String 性能和优化

HoneyMoose

Java String 构造方法中的内存分配

HoneyMoose

面试突击59:一个表中可以有多个自增列吗?

王磊

Java 面试

一文走近ZMQ

No Silver Bullet

6月月更 ZMQ

如何进行高效简洁的电子文档管理

小炮

Java String 手工引用指针

HoneyMoose

Eureka的InstanceInfoReplicator类(服务注册辅助工具)

程序员欣宸

Java SpringCloud 6月月更

社区文章|MOSN 构建 Subset 优化思路分享

SOFAStack

负载均衡 开源 开发者 算法

Go Web 编程入门:验证器

宇宙之一粟

Go 语言 表单校验 6月月更

redis精讲系列介绍七-过期策略

Nick

Redis 核心技术与实战 6月月更 redis精讲 redis 过期策略 redis 底层原理

axios框架入门教程

倔强的牛角

axios 6月月更

我对新能源汽车的一些看法(37/100)

hackstoic

新能源汽车 生活杂谈

Java 字符串引用(String Interning)

HoneyMoose

DingOS服务提交IPO配置指南

鼎道智联

前端 开发 IPO配置

如何使用物联网低代码平台进行报表管理?

AIRIOT

物联网 低代码平台

Gitlab运维篇之——备份及恢复

阿呆

#GitLab 备份恢复

缓存穿透利器之「布隆过滤器」

Ayue、

redis 布隆过滤器

今天,SysAK 是如何实现业务抖动监控及诊断?&手把手带你体验Anolis OS|第25-26期

OpenAnolis小助手

Linux sig 龙蜥大讲堂 开源贡献 社区运维

唐太宗把微服务的“心跳机制”玩到了极致!

悟空聊架构

微服务 Eureka 悟空聊架构 6月月更 心跳机制

DOM 节点

Jason199

DOM js DOM事件 6月月更

Linux开发_curl调用网络接口

DS小龙哥

6月月更

钟珊珊:被爆锤后的工程师会起飞|OneFlow U

OneFlow

自我介绍 实习

Java自定义Once方法保障单次执行

FunTester

IDE 的主题应该用亮色还是暗色?终极答案来了!

胡说云原生

ide vscode IDEA goland ide主题

leetcode 279. Perfect Squares 完全平方数(中等)

okokabcd

LeetCode 动态规划 算法与数据结构

滴滴工程效能平台建设之路

laofo

互联网 DevOps 研发效能 持续交付 工程效能

JAVA SOCKET编程——TCP/UDP

乌龟哥哥

6月月更

Java String 文字(Literal)和 对象(Object)初始化

HoneyMoose

DOM编程

大熊G

JavaScript 前端 6月月更

5道面试题,拿捏String底层原理!

码农参上

string 底层原理 死磕 Java 基础

Java 9发布在即,Oracle OpenJDK着手优化Unsafe类_Java_Monica Beckwith_InfoQ精选文章