通过自定义分配器解决 ZGC中的碎片问题

1.问题

ZGC 和其他垃圾收集器通常使用碰撞指针分配,这对于顺序分配很有效,但随着时间的推移会导致碎片化。当产生无法轻松重用的内存间隙时,就会发生碎片化,这需要昂贵的活动对象重新定位。这项研究的目标是通过使用基于空闲列表的分配器和碰撞指针分配器来减少 ZGC 中的重新定位需求,这可以在某些情况下更有效地跟踪和利用碎片内存。

2.方法

主要思路是调整分配器,使其更适合在 ZGC 中使用,该分配器是基于两级隔离匹配 (TLSF) 分配器进行优化的。具体工作包括:

2.1.0 字节标头

通过利用 ZGC 中的信息,分配器引入了 0 字节标头,从而显著减少了内部碎片。如下图显示。

2.2.ZGC 小页面

将分配器限制在 ZGC 的有限大小(2MB)和分配大小范围(16 B, 256 KB)内使用,可以更有效地存储和使用内部表示。下图显示了如何将大量的一级和二级扁平化为 64 位字。

2.3.并发

使用无锁机制支持分配器上的并发操作,该机制考虑了许多不同的问题和用例。

2.4.功能融合

0 字节标头尤其值得注意,因为它是通过对分配器进行一系列较小的调整而实现的。推迟合并、将支持的堆大小减小到 ZGC 的小页面大小以及利用 Java Object 标头中已有的信息等调整使 0 字节标头成为可能。此外,并发问题可以通过多种方式解决,但实际研究中的无锁解决方案通过上述调整变得更容易实现。如果没有这些调整,实现无锁解决方案将复杂得多。

3.结果

经过修改的分配器显示出在 ZGC 中使用的良好潜力,重点是分配内存。

  • 性能:对于单次分配,新分配器的性能与参考实现相当。但是,对于单次释放和实际分配模式,它的速度略慢。考虑到碎片的显著减少,这种权衡被认为是可以接受的。

  • 内存效率:0 字节标头的引入和其他优化显著减少了内部碎片。内存效率的提高表明新的分配器在管理碎片内存方面非常有效。

4.总结

定制分配器以用于 ZGC 等垃圾收集器是解决内存碎片问题的可行方法。经过调整的分配器不仅减少了昂贵的重新定位需求,而且还提高了整体内存效率。如上所属,TLSF 有很大的潜力可以用于 ZGC,这也可能适用于其他分配器。最明显的下一步是将分配器集成到 ZGC 中。其他需要考虑的领域包括具体项目中 Java 中的新最小分配大小以及解决经过调整的分配器的并发实现中的饥饿问题。

相关推荐
hetao17338371 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
\光辉岁月/1 小时前
5.java-数组
java·开发语言
谢亮_vipxieliang2 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
Zootopia6262 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan2 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
郑州光合科技余经理2 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
2601_962071572 小时前
类变量和全局变量的生命周期有什么区别?
java·开发语言·jvm
code2cat2 小时前
Java进阶篇之AtomicReference:一次替换引用,读到一份完整状态
java·并发编程·不可变对象·atomicreference
专业程序开发源2 小时前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
Wang's Blog2 小时前
Java 项目实战: 外卖平台优化-前后端分离开发模式与工程拆分
java·开发语言