热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

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

拍脑袋想出来的内存分配算法,大家来帮我分析分析,完善完善。这个算法适合可变长对象,并且经常要扩展的内存块的分配,比
     拍脑袋想出来的内存分配算法,大家来帮我分析分析,完善完善。

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

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

     首先申请一块大内存,大小为 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 ≤ N,那么更新 M=a,然后 X+1 完成分配。当然,如果 a>N 那么就爆仓了。
     如果要对折,那么新格子大小 n=N/2。按同样逻辑,如果 a   M   n,那么 X+1 完成分配,如果 M ≤ n,那么更新 M=a,然后 X+1 完成分配。如果 a>n 那么就爆仓了。

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

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

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

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

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

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




推荐阅读
  • 面试题总结_2019年全网最热门的123个Java并发面试题总结
    面试题总结_2019年全网最热门的123个Java并发面试题总结 ... [详细]
  • 本文详细介绍如何使用Netzob工具逆向未知通信协议,涵盖从基本安装到高级模糊测试的全过程。通过实例演示,帮助读者掌握Netzob的核心功能。 ... [详细]
  • 无论是在迁移到云服务还是更换云服务商的过程中,数据迁移都是一个至关重要的环节。本文将探讨数据迁移中可能遇到的问题及解决方案,包括路径问题、速度问题和数据完整性等。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 高端存储技术演进与趋势
    本文探讨了高端存储技术的发展趋势,包括松耦合架构、虚拟化、高性能、高安全性和智能化等方面。同时,分析了全闪存阵列和中端存储集群对高端存储市场的冲击,以及高端存储在不同应用场景中的发展趋势。 ... [详细]
  • 本文详细介绍了如何使用OpenSSL自建CA证书的步骤,包括准备工作、生成CA证书、生成服务器待签证书以及证书签名等过程。 ... [详细]
  • 本文回顾了作者初次接触Unicode编码时的经历,并详细探讨了ASCII、ANSI、GB2312、UNICODE以及UTF-8和UTF-16编码的区别和应用场景。通过实例分析,帮助读者更好地理解和使用这些编码。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 优化后的标题:Apache Cassandra数据写入操作详解
    本文详细解析了 Apache Cassandra 中的数据写入操作,重点介绍了 INSERT 命令的使用方法。该命令主要用于将数据插入到指定表的列中,其基本语法为 `INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...)`。通过具体的示例和应用场景,文章深入探讨了如何高效地执行数据写入操作,以提升系统的性能和可靠性。 ... [详细]
  • 原子操作是指在执行过程中不会被中断的操作。本文将探讨Java是如何通过不同的技术手段实现原子操作的,包括CPU层面的总线加锁和缓存行加锁,以及Java层面的锁机制和CAS操作。 ... [详细]
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 本章介绍了TCP/IP协议族中的链路层,其主要功能是为IP模块发送和接收IP数据报。链路层还支持一些辅助性协议,如ARP。此外,本文详细探讨了不同类型的链路层技术及其应用。 ... [详细]
  • Python 3 Scrapy 框架执行流程详解
    本文详细介绍了如何在 Python 3 环境下安装和使用 Scrapy 框架,包括常用命令和执行流程。Scrapy 是一个强大的 Web 抓取框架,适用于数据挖掘、监控和自动化测试等多种场景。 ... [详细]
author-avatar
临海小少年
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有