Java值类型设计进展
极客时间编辑部
讲述:杜力大小:1.14M时长:02:29
近日,OpenJDK 项目 Valhalla 发布了一项重大更新,宣布了 JVM 值类型中一些尚处于极早期阶段的设计概念。
包括 Java 9 在内的之前所有版本 ,都只有基本类型和对象引用这两种类型的值。Java 没有类似结构这样的东西,任何复合数据类型都只能通过引用访问。换句话说,Java 环境有意不提供内存分配的底层控制。
这种内存分配模式在过去的 20 年里,是 Java 平台内存分配的主要实现模式。它的优点是非常简单,但伴随着大量的性能权衡,例如对象数组的处理就会涉及不可避免的间接寻址和随之而来的缓存未命中。
因此,许多性能导向的程序员会喜欢定义可以更高效分配内存的类型:值类型。
在这些新类型中,复合数据的各个数据项不需要有一个完整的对象头,这样可以降低开销。消除对象头也同时消除了当前所有 Java 对象都具有的特定于实例的元数据。
这种方法的其中一个后果是对象标识会丢失,当且仅当所有字段都相等时值才相等。这使得值类型有和基本类型类似的行为,值的每一个副本根本就没有自己的标识。
为了顺应这一重大变化,就需要引入一些新的字节码,目前据说只需要新增 2 个操作码:
vdefault:会为特定的值类型生成默认实例;
withfield:为值类型生成一个新值,并抛出无效值。
部分已有的字节码也需要进行一些修改来处理值类型。
同时,在 VM 层面上也需要做一些工作,以便核心库在演化过程中可以保持兼容性。例如,现在已经可以在方法中测试 Object 变量,看它是否真的包含值对象。
Valhalla 项目正在进行中的研究产生了以下尚处于早期阶段的设计概念,在 VM 层面应该有三种不同类型的 JVM 类及接口类型:
引用类型表示类实例的引用,该实例有一个标识,或者为空;
值类型包含没有标识的值类实例;
通用类型可以是其他两种类型中的任意一种。
这里有一个显而易见的问题:应该如何理解现有类文件中的类型信息?
也就是说,Java 9 类文件中现有的对象类型究竟应该视为引用类型还是通用类型?这是只是个简单的例子,毕竟之前从未见过值类的实例。
不过,由于当前的设计尚处于非常早期的阶段,到生产就绪及代码交付可能还需要数年。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
请先领取课程
免费领取
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(1)
- 最新
- 精选
- 闫飞起码也是在缓慢往前演化了,相比那边C+ +而言步子太慢了
收起评论