通过自定义分配器解决 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 中的新最小分配大小以及解决经过调整的分配器的并发实现中的饥饿问题。

相关推荐
FQNmxDG4S4 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
超级码力6664 小时前
【Latex文件架构】Latex文件架构模板
算法·数学建模·信息可视化
穿条秋裤到处跑4 小时前
每日一道leetcode(2026.04.29):二维网格图中探测环
算法·leetcode·职场和发展
Merlos_wind5 小时前
HashMap详解
算法·哈希算法·散列表
虹科网络安全5 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje5 小时前
Java语法进阶
java·开发语言·jvm
汉克老师5 小时前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级
rKWP8gKv75 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫5 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287925 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日