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

相关推荐
Sammyyyyy几秒前
Rust 1.92.0 发布:Never Type 进一步稳定
java·算法·rust
alonewolf_9911 分钟前
深入解析G1与ZGC垃圾收集器:原理、调优与选型指南
java·jvm·算法
小镇学者12 分钟前
【c++】C++字符串删除末尾字符的三种实现方法
java·开发语言·c++
rfidunion13 分钟前
springboot+VUE+部署(1。新建项目)
java·vue.js·spring boot
小翰子_14 分钟前
Spring Boot整合Sharding-JDBC实现日志表按月按周分表实战
java·spring boot·后端
weixin_3993806922 分钟前
OA 系统假死问题分析与优化
java·运维
数据大魔方40 分钟前
【期货量化实战】螺纹钢量化交易指南:品种特性与策略实战(TqSdk完整方案)
python·算法·github·程序员创富·期货程序化·期货量化·交易策略实战
豆沙沙包?41 分钟前
2026年--Lc334-2130. 链表最大孪生和(链表转数组)--java版
java·数据结构·链表
柒.梧.1 小时前
SSM常见核心面试问题深度解析
java·spring·面试·职场和发展·mybatis
杨章隐1 小时前
Java 解析 CDR 文件并计算图形面积的完整方案(支持 MultipartFile / 网络文件)@杨宁山
java·开发语言