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

相关推荐
User_芊芊君子25 分钟前
【JavaSE】复习总结
java·开发语言·python
我有一颗五叶草34 分钟前
线程间通信
java·开发语言
金融小师妹2 小时前
基于哈塞特独立性表态的AI量化研究:美联储政策独立性的多维验证
大数据·人工智能·算法
我真的是大笨蛋5 小时前
K8S-Pod(下)
java·笔记·云原生·容器·kubernetes
碳水加碳水5 小时前
Java代码审计实战:XML外部实体注入(XXE)深度解析
java·安全·web安全·代码审计
纪元A梦5 小时前
贪心算法应用:化工反应器调度问题详解
算法·贪心算法
深圳市快瞳科技有限公司6 小时前
小场景大市场:猫狗识别算法在宠物智能设备中的应用
算法·计算机视觉·宠物
liulilittle6 小时前
OPENPPP2 —— IP标准校验和算法深度剖析:从原理到SSE2优化实现
网络·c++·网络协议·tcp/ip·算法·ip·通信
努力也学不会java6 小时前
【设计模式】 原型模式
java·设计模式·原型模式
方渐鸿6 小时前
【2024】k8s集群 图文详细 部署安装使用(两万字)
java·运维·容器·kubernetes·k8s·运维开发·持续部署