Java对象头压缩---- 永久为Java应用“降本增效”

简介: 本文介绍了一下OpenJDK的最新技术,对象头压缩,来大幅优化Java对象的内存占用。

前言

Java丰富的生态和语言强大的内存管理技术(GC),使得Java应用的开发非常便捷,各类应用场景的适配都非常优秀,大大减少了从Idea到应用落地的难度。不过这一切也不是没有代价的,针对于Java应用内存占用比较高的问题一直拿出来和其他语言比较。虽然JVM已经自带了例如指针压缩(compressed oops)来节约内存开销,不过Java Object对象头本身占用的内存还是非常可观。本文就介绍一下OpenJDK的最新技术,对象头压缩,来大幅优化Java对象的内存占用。目前这个技术尚未在Java语言官方实现OpenJDK中正式发布,但是Dragonwell11已经率先应用,请参考JDK发布指南:Dragonwell 11 release notes[1]


Java对象头压缩 JEP 450: Compact Object Headers


Java对象头压缩技术,已经创建官方的JEP[2]。JEP源自Shenandoah GC的project lead Roman Kenne创建的Lilliput:https://openjdk.org/projects/lilliput[3]。(Lilliput意为《格列佛游记》中的小人国,含义不言而喻)


Java的对象布局

我们以基础类型java.lang.long为例

image.png

Compact object headers的核心逻辑是将单独的narrow klass指针(压缩class指针)encode在基础的对象头的第一个word:mark word中,释放原先单独占用一个word的narrow-klass/klass指针的空间,从而实现对Java对象头整体的压缩和内存占用优化。我们可以看到java.lang.Long对象应用对象头压缩后,内存占用从24 bytes减少到16 bytes,减少了1/3。由于原始layout的java对象头需要支持biased locking以及CMS GC,需要预留更多的unused bits,所以使用对象头压缩无法支持biased locking以及CMS。(注:biased locking在JDK17中默认关闭,JDK21+中删除,CMS GC在JDK17+中删除)


“Early adopters of Project Lilliput who have tried it with real-world applications confirm that live data is typically reduced by 10%–20%.”


JEP中提到,早期的项目试用者在实际应用中发现内存占用下降10-20%。


JEP 450: Compact Object Headers依赖的主要实现


JDK-8291555[4]


使用了一个stack locking的替换方案,代替了原先的stack locking。原先的stack locking需要将object mark word交换到stack上,而产生remote object header的情况,压缩对象头后,频繁lock/unlock会无法稳定获取klass指针。



JDK-8305896[5]

在G1等的Full GC中,object mark word会用来保存forward oop,从而在GC过程中,将无法正确获取class指针,因此,需要有额外的机制来保存forward oop。


JDK-8305898[6]


在G1/Parallel GC等的gc过程中,如果出现evacuation failure,将产生self forwarding的情况,对象头会用来存放自身对象指针(oop),也会引起class指针无法读取,因此需要换一种方法,使用self forward bit来标注java对象(oop)在gc过程中是否self forwarding。


JDK-8305895[7]


JEP450主体实现。完成了由+/-UseCompactObjectHeaders控制的对象头压缩的实现。


JDK-8328138(阿里巴巴Propose)[8]


修复了因为对象头压缩引起的ARM服务器Arrays.equals的潜在crash问题,并提升ARM服务器 Arrays.equals的性能。


UseCompactObjectHeaders实测效果

Dragonwell JDK的UseCompactObjectHeaders,进行了完善JDK回归测试,并在多个主流核心场景中进行了验证,主要有如下几个典型的优势:


1. Java对象内存占用减少5-10%左右


2. Java新分配对象内存占用(allocation rate)和GC频率降低5-10%左右


3. CPU和基础吞吐性能基本保持一致,部分内存带宽使用较高的场景中,显著提升吞吐性能(例如SPECjbb2015和Flink)


SPECjbb2015

在SPECjbb2015基准测试中(倚天平台),max(极限吞吐)和critical(低延迟要求吞吐)分别提升6.17%和9.01%。

image.png

Flink大数据

Flink的基准benchmark nexmark在倚天平台下,平均吞吐提升约10%。阿里云的客户实测得到近似的优化效果。

image.png


淘宝天猫电商核心应用

淘宝天猫电商核心系统,实测G1 young GC频率降低约7%。

image.png

对象头压缩Compact Object Headers FAQ

1. 如何使用对象头压缩功能?

在支持该功能的Dragonwell 11的JDK版本中,增加启动参数-XX:+UseCompactObjectHeaders,仅支持-XX:+UseG1GC(默认)和-XX:+UseParallelGC


2.为何OpenJDK官方未发布的技术,已经在Dragonwell 11中发布,使用会有什么潜在风险吗?


目前的Compact object headers的实现无法支持ZGC,ZGC支持依赖的JDK-8315884的实现尚未完成。同时Lilliput在Object header上的改动关系到Java未来重点项目Valhala project(Value Object)对Object header的定义,还没有明确定论。因此OpenJDK Compact object headers的正式发布还没有确切时间表,并非受制于本身技术实现。不过这并不影响我们在当前的JDK LTS版本中落地该技术,Dragonwell 11在支持Compact object headers时,仅支持最常用的默认G1 GC以及Parallel GC。目前在阿里内部各类场景中大规模使用,均未发现风险。



参考链接:

[1]https://github.com/dragonwell-project/dragonwell11/wiki/阿里巴巴Dragonwell11-Extended发布说明[2]https://openjdk.org/jeps/450
[3]https://openjdk.org/projects/lilliput[4]https://bugs.openjdk.org/browse/JDK-8291555[5]https://bugs.openjdk.org/browse/JDK-8305896[6]https://bugs.openjdk.org/browse/JDK-8305898[7]https://bugs.openjdk.org/browse/JDK-8305895

[8]https://bugs.openjdk.org/browse/JDK-8328138


来源  |  阿里云开发者
作者  |  
毛亮

相关文章
|
13天前
|
安全 Java API
Java SE 与 Java EE 区别解析及应用场景对比
在Java编程世界中,Java SE(Java Standard Edition)和Java EE(Java Enterprise Edition)是两个重要的平台版本,它们各自有着独特的定位和应用场景。理解它们之间的差异,对于开发者选择合适的技术栈进行项目开发至关重要。
66 1
|
2月前
|
设计模式 XML 安全
Java枚举(Enum)与设计模式应用
Java枚举不仅是类型安全的常量,还具备面向对象能力,可添加属性与方法,实现接口。通过枚举能优雅实现单例、策略、状态等设计模式,具备线程安全、序列化安全等特性,是编写高效、安全代码的利器。
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
Java 大视界 -- Java 大数据机器学习模型在自然语言生成中的可控性研究与应用(229)
本文深入探讨Java大数据与机器学习在自然语言生成(NLG)中的可控性研究,分析当前生成模型面临的“失控”挑战,如数据噪声、标注偏差及黑盒模型信任问题,提出Java技术在数据清洗、异构框架融合与生态工具链中的关键作用。通过条件注入、强化学习与模型融合等策略,实现文本生成的精准控制,并结合网易新闻与蚂蚁集团的实战案例,展示Java在提升生成效率与合规性方面的卓越能力,为金融、法律等强监管领域提供技术参考。
|
2月前
|
存储 监控 数据可视化
Java 大视界 -- 基于 Java 的大数据可视化在企业生产运营监控与决策支持中的应用(228)
本文探讨了基于 Java 的大数据可视化技术在企业生产运营监控与决策支持中的关键应用。面对数据爆炸、信息孤岛和实时性不足等挑战,Java 通过高效数据采集、清洗与可视化引擎,助力企业构建实时监控与智能决策系统,显著提升运营效率与竞争力。
|
2月前
|
存储 人工智能 算法
Java 大视界 -- Java 大数据在智能医疗影像数据压缩与传输优化中的技术应用(227)
本文探讨 Java 大数据在智能医疗影像压缩与传输中的关键技术应用,分析其如何解决医疗影像数据存储、传输与压缩三大难题,并结合实际案例展示技术落地效果。
|
2月前
|
存储 数据采集 搜索推荐
Java 大视界 -- Java 大数据在智慧文旅旅游景区游客情感分析与服务改进中的应用实践(226)
本篇文章探讨了 Java 大数据在智慧文旅景区中的创新应用,重点分析了如何通过数据采集、情感分析与可视化等技术,挖掘游客情感需求,进而优化景区服务。文章结合实际案例,展示了 Java 在数据处理与智能推荐等方面的强大能力,为文旅行业的智慧化升级提供了可行路径。
Java 大视界 -- Java 大数据在智慧文旅旅游景区游客情感分析与服务改进中的应用实践(226)
|
2月前
|
机器学习/深度学习 安全 Java
Java 大视界 -- Java 大数据在智能金融反洗钱监测与交易异常分析中的应用(224)
本文探讨 Java 大数据在智能金融反洗钱监测与交易异常分析中的应用,介绍其在数据处理、机器学习建模、实战案例及安全隐私等方面的技术方案与挑战,展现 Java 在金融风控中的强大能力。
|
2月前
|
机器学习/深度学习 算法 Java
Java 大视界 -- Java 大数据机器学习模型在生物信息学基因功能预测中的优化与应用(223)
本文探讨了Java大数据与机器学习模型在生物信息学中基因功能预测的优化与应用。通过高效的数据处理能力和智能算法,提升基因功能预测的准确性与效率,助力医学与农业发展。
|
2月前
|
Java 大数据 数据处理
Java 大视界 -- 基于 Java 的大数据实时数据处理在工业互联网设备协同制造中的应用与挑战(222)
本文探讨了基于 Java 的大数据实时数据处理在工业互联网设备协同制造中的应用与挑战。文章分析了传统制造模式的局限性,介绍了工业互联网带来的机遇,并结合实际案例展示了 Java 在多源数据采集、实时处理及设备协同优化中的关键技术应用。同时,也深入讨论了数据安全、技术架构等挑战及应对策略。
|
2月前
|
数据采集 搜索推荐 Java
Java 大视界 -- Java 大数据在智能教育虚拟学习环境构建与用户体验优化中的应用(221)
本文探讨 Java 大数据在智能教育虚拟学习环境中的应用,涵盖多源数据采集、个性化推荐、实时互动优化等核心技术,结合实际案例分析其在提升学习体验与教学质量中的成效,并展望未来发展方向与技术挑战。