全新的内存分配算法(折纸算法)

     拍脑袋想出来的内存分配算法,大家来帮我分析分析,完善完善。

     这个算法适合可变长对象,并且经常要扩展的内存块的分配,比如字符串。是空间换时间的算法。

     想象一张长长的纸条,不断的对折它,就可以把纸条分成一格一格,而且每次对折格子小一半,数量多一倍是吧。这个算法和这个过程很想,因此我命名为折纸算法。

     首先申请一块大内存,大小为 O,另外还需要2个变量,X 保存分配的次数,M 保存内部分配的对象的最大大小。

     当每次分配内存时,第一次分配在偏移量0的位置,第二次 1/2 * O 的位置,第三次 1/4 * O, 第四次 3/4 * O, 第五次 1/8 * O, 第六次 3/8 * O ...
     
     每次分配的时候,X 不断的 +1,因此从 O 和 X 可以直接计算出分配地址,好比每次都对折纸条,然后从新的折痕依次分配。
     由于每次都是对半折,因此从内存块原始大小和分配次数可以计算出格子的大小,记 N。
     如果要分配新内存大小为 a,先计算是否要对折,如果不需要,那么如果 a   M   N,那么 X+1 完成分配,如果 M < a   N,那么更新 M=a,然后 X+1 完成分配。当然,如果 a>N 那么就爆仓了。
     如果要对折,那么新格子大小 n=N/2。按同样逻辑,如果 a   M   n,那么 X+1 完成分配,如果 M < a   n,那么更新 M=a,然后 X+1 完成分配。如果 a>n 那么就爆仓了。

     这样分配的好处,不需要维护链表,只需要更新2个变量及计算就可以完成分配,这两个变量可以直接采用 CAS 操作一次更新,因此可以并行操作。
     当我们需要扩展对象的大小时,如果对象的新大小 A   M,那么可以不进行任何操作,直接扩张。如果对象大小 M < A   N,那么只要更新 M 就可与完成对象的扩展。如果 A > N,那么爆仓。
     爆仓后,把引起爆仓的对象从内存池里拿出来就好了。
     对象的大小越接近,内存浪费越少。如果对象大小差距比较大,可能比较浪费。但是你不需要预先设定格子的大小,格子是动态调整的,因此,有时候内存利用率比固定的算法更高。

     PS: 这样分配对象天然对齐,并且天然免疫缓冲区冲突。

     如果你需要分配的对象大小未知,并且经常需要扩展,也许可以试试它?

     内存的释放可以采用多种策略,比如如果基于 GC 可以交换被释放对象和最后块(复制 M 个字节就可以了),或者另外维护一个被释放对象的链表等等。

     由于 M 会不断变大,不会缩小,而M过大可能造成浪费,因此也可以想一些重置整个内存块的策略。

     好了,我应该描述清楚了吧,大家思考一下,看看是否可行吧。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值