本文讨论了Java虚拟机(JVM)如何优化泛型代码。自2004年起,Java支持泛型,提升了算法和数据结构的重用性。JVM通过类型分析、内联和去虚拟化等技术提高性能,接近C++模板的速度。然而,性能可能因配置污染而下降。随着Valhalla项目的推进,Java将引入值类,改变内存数据布局,增加泛型优化的难度。短期内有解决方案,长期目标是实现泛型专门化,生成优化的类型特定代码。
本文讨论了项目Valhalla的核心特性之一:值类及其扁平化(内联)概念,适合JVM开发者和对Java底层工作原理感兴趣的读者。
JEP 401《值类与对象》重新成为候选,Project Valhalla发布了新的早期访问版本,允许在Java中实验无身份值类。这些值类提升了可读性和维护性,并为Java运行时提供了更多优化空间。
项目Valhalla的初步扁平化依赖于四种属性值类型。随着对值类型的深入理解,发现某些属性不适合。JEP 401定义值类实例为无身份和(大部分)不可变。扁平化提高了内存密度,但也增加了访问成本和代码复杂性。C2编译的扁平数组表现最佳,而其他VM组件处理扁平值时可能导致性能下降。
Valhalla团队发布了早期访问的JDK构建,全面实现了JEP 401:值类和对象(预览)。值对象是仅包含最终字段且没有身份的类实例,使用值类可提升性能,JVM能够优化这些对象。用户可下载体验这一新特性。
甲骨文公司预览了即将发布的Java新功能,包括稳定值API、增强的基本类型装箱、空限制值类、值类与对象的关系,以及派生记录的创建。这些功能旨在提升性能和简化编程模型,预计将在JDK 25中推出。
项目Valhalla旨在通过引入值类修复Java类型系统中类与原始类型之间的裂缝。值类具有类的编码方式和int的工作效率,提供扁平且紧凑的内存布局。经过10年的重构,这一重大改进即将完成。Java语言架构师Brian Goetz在Devoxx 2024上详细介绍了这一解决方案。
Project Valhalla当前提案包括值类和空值标记,允许Java开发者创建性能接近原始类型但具备引用类型功能的类型,实现“像类一样编码,像int一样工作”的理念。Brian Goetz在JVMLS 2024上介绍了最新进展。
完成下面两步后,将自动完成登录并继续当前操作。