XMM (eXtensible) Memory Manager - 完全自主第三方 Go 内存分配管理器

XMM 是什么?

XMM - X(eXtensible) Memory Manager(完全自主研发的第三方 Go 内存分配管理器)

XMM 是一个在 Go 语言环境中完全自主实现的第三方内存管理库,不依赖于 Go 本身的任何内存管理能力,纯自主实现的 Go 内存管理库;能够应对各种场景下大小内存的 分配/释放/管理
等工作,能够帮助适用于任何复杂数据结构的构建(链表/数组/树/hash 等场景),能够良好完美的逃逸掉 Go 内置的 GC 机制,保证程序的超高性能,是构建高性能程序基础设施。

XMM 主要具备以下特点

  1. XMM 是一个在 Go 语言环境中完全自主实现的第三方内存管理库,不依赖于 Go 本身的任何内存管理能力,通过 6000 行纯 Go 代码自主实现的 Go 内存管理库,适合不用 Go 的 GC 想要自己管理内存的场景。

  2. XMM 能够应对各种场景下大小内存的 分配/释放/管理 等工作,能够帮助适用于任何复杂数据结构的构建,比如链表/数组/树/哈希表等等场景;XMM 可以让你像 C/C++ 一样方便便捷使用系统内存,并且不用担心性能问题。

  3. XMM 能够良好完美的逃逸掉 Go 内置的 GC 机制,保证程序的超高性能,是构建高性能程序基础设施;但与 sync.Pool 等实现机制完全不同,sync.Pool 等使用字节流实现来逃逸 GC,XMM 是纯使用 Linux 系统的
    mmap 作为底层内存存储,XMM 更像 TcMalloc 等内存分配器。

  4. XMM 协程安全,且分配性能超高,目前在普通 Linux 服务器上面可以达到 350w alloc/s,就是每秒可以进行 350 万次的内存分配操作不卡顿,非常适合想要自主管理内存且超高性能场景。

  5. XMM 内存库使用接口简单,兼容性强,能够兼容 Go 1.8 以上版本,容易上手(推荐 go 1.12+ 版本更好),可以在 XMM 之上重构你所有想要的高性能数据结构,比如 map/slice
    等等。(案例部分可以做一些数据结构实现的参考)

为什么要设计 XMM?

为什么要设计自主的内存管理器?

为了应对在多种内存管理的场景下的使用,可能需要有一些除了内置数据结构外的一些内存自主调度使用的场景,比如构建复杂的高性能的数据结构,在大规模内存占用,或者是非常多的小内存块占用场景下,能够尽量减少 Go 的 GC
机制,保障服务性能稳定不会因为 GC 而产生抖动。

为什么不使用内置的 map/slice 等数据结构?

Golang 本身为了性能和内存可控,整个内存管理是完全封闭不对外的,并且有自主的 GC 机制,需要自主内存管理比较麻烦;Go 中自带的 GC 机制经过很多个版本的迭代,到目前性能已经很不错,但是在大规模的碎片化内存块下面,GC
还是会有一定损耗,在极端高性能场景下,GC 会让整个后台应用服务性能上不去(或偶尔卡顿)。所以一句话,Go 本身指针等还有性能会受到 GC 的影响,导致服务性能总是上不去。

为什么不使用其他开源的内存池?

  1. 除 Go 本身的内存模块,调研了解现有大部分的第三方 对象池/内存池/字节池 等需要某块自主内存操作的场景中基本是 Map/sync.Pool/Bytes[] 等方式。

  2. Map 数据结构适合保存各类型数据,但 GC 概率大; sync.Pool 这类保存复用临时对象,也可以各种数据机构,可适当减少 GC(无法避免 GC); Bytes[]
    方式来保存字节数据,并且只能保存字节数据,通过某些处理,尽量逃避 GC 扫描;(对比参考 Go 语言基于 channel 实现的并发安全的字节池 )

  3. 现有开源库包括:依赖于 sync.Pool 的比如字节的
    mcache gopkg/mcache.go;采用 Bytes[] 方式的比如 MinIO
    的的 bpool minio/bpool.go ,都可以学习参考。

  4. 结论:XMM 与他们实现机制完全不同,XMM 更靠近 Go 内置内存分配机制原理

XMM 的最终设计结论是什么?

为了完全实现最终为了逃逸掉 Golang 的 GC 机制,以及拥有完全自主可控的内存管理分配操作,在面对成千上万的小对象场景中,不会因为 Go 本身 GC 机制带来任何的抖动,所以自主从零开始实现了 XMM 模块,达到在 Go 程序中调用
XMM 模块可以达到完美的自主内存 申请/释放/管理 的功能,并可以完美逃逸掉 Go 的 GC 机制。

XMM 设计的目标是什么?

为了保证高性能,XMM 设计之初,就定下了三个核心目标:

  1. 单机(6 核心 KVM 或物理机)内存分配性能达到 350w+ alloc/s;(每秒内存分配速度,已实现);

  2. 可以支持调用用户手工强制Free某个申请内存块,也可以支持XMM自身自动GC某些未手工Free的内存库;(自主实现GC功能,目前建议手动Free(), 未来版本实现

  3. 不会内存泄露,并且内存管理不是粗糙的,而颗粒度细致的,完全尽量可媲美行业主流的内存管理分配器。(已实现

XMM性能测试数据

XMM性能测试情况

XMM 快速使用入门

XMM 使用案例 ☆

说明:XMM 测试程序快速预览下载使用

  1. XMM 使用 - 入门
  2. XMM 使用 - 结构体
  3. XMM 使用 - 链表
  4. XMM 使用 - 哈希表

XMM 实现原理介绍

1. XMM 的核心设计与实现流程

1. XMM 设计实现技术调研参考

1. XMM 内部技术设计问题Q&A

【开源推荐】XMM Go语言环境中完全自主实现的第三方内存管理库相关推荐

  1. 在R语言环境中无法载入rJava包的解决办法

    问题描述: 安装包xlsx包后,运行library("xlsx")后弹出错误窗口: RGui (64-bit): Rgui.exe - 系统错误 无法启动此程序,因为计算机中丢失 ...

  2. 在成长中遇到的挫折事件对你的影响_多种语言环境中成长的宝宝,会影响说话早晚?其实没有想象的复杂...

    关于用多种语言抚养孩子的案例比比皆是,但并不是所有的父母都鼓励这样做,他们被告知这会导致孩子混乱和语言延迟,使他们错过机会之窗. 以下是最常见的案例,以及把孩子培养成双语者背后的真实故事. 误解一.与 ...

  3. 计算机语言中nl,这个nl_NL语言环境中的日期时间模式是什么?

    在我的项目,我使用的日期转换如下(我已经采取了只有相关块为简洁)这个nl_NL语言环境中的日期时间模式是什么? import java.text.ParseException; import java ...

  4. Facebook开源ptr:在Python环境中并行运行单元测试

    Facebook开源了一个名为Python Test Runner(ptr)的新项目,允许开发人员运行Python单元测试套件.ptr和现有测试运行器之间的主要区别在于ptr通过爬取存储库查找一定的P ...

  5. android 阿拉伯语日期,如何在阿拉伯语语言环境中以简单日期格式解析日期?

    我的日期来自服务器&是格式="2013-01-20T16:48:43"我的应用程序支持阿拉伯语&英语区域.但是当我将语言环境更改为阿拉伯语时,日期不会解析它给我的解 ...

  6. 《C++类和对象中的static、友元以及内存管理 总结》

    学习完前面有关类和对象的基础知识,这里再对其中的某些容易出现的错误及经常性会遇到的问题进行阐述,加深对类和对象的理解是学好C++的基础. 文章目录 1.再次谈及构造函数 2.static成员 3.友元 ...

  7. php开源堡垒机,开源堡垒机在开发环境中的使用方案-麒麟开源堡垒机

    一.部署说明: 开发环境主要使用开发人员的PC或笔记本终端进行开发,开发完成后,将代码交付相应的负责人,负责人编译测试后,将代码上传到CVS备份,将程序上传到生产环境使用.这种管理模式主要存在如下问题 ...

  8. 实用的pythondjango项目_推荐10个django开发过程中比较好用的第三方包

    花了2个月左右的时间来开发微信端的便民服务乐盟同城系统,现在是有了基本的功能雏形.不过,对于一个完善的系统,还有很多需要做的事情.在开发的过程中,也新发现了一些比较好用的第三方工具包,减少了不少重复性 ...

  9. Linux环境中MySQL主从同步--添加新的从库

    当前我认为数据库主从有两大应用价值: 1.从库相当于主库的备份.虽然数据库的主从并不能代替/取代备份,例如错误的数据可能毁掉所有的数据库,但主从也是在一种可读的状态下保持备份的一种实现方式. 2.从库 ...

最新文章

  1. Linux常用命令--网终设置
  2. 【数据结构】所有顶点对的最短路径 Floyd算法
  3. 备份软件 FreeFileSync 怎么用
  4. 回文质数(洛谷P1217题题解,Java语言描述)
  5. 从hadoop-0.20.2升级到hadoop-1.0.3
  6. linux裸磁盘的配置,【存储】nas模拟裸磁盘挂载swift
  7. ios 8 适配须知
  8. 接口测试之Postman使用全图文指南(原来使用Postman测试API接口如此简单)
  9. 【MATLAB】求极限
  10. html 加号按钮变减号,带有javascript附加输入的加号/减号按钮
  11. topcoder java_Topcoder 练习小记,Java 与 Python 分别实现。
  12. 真探rust和maggie_《真探》报选艾美最佳剧情类 老白与Rust将厮杀
  13. DWT(离散小波变换)与其简单应用
  14. what is the mes (mes系统是什么)
  15. linux中设置ssh登录时显示的banner
  16. Pycharm的python interpreter选择
  17. Qt5.14.2使用虚拟键盘
  18. maven 程序包不存在 https://repo.maven.apache.org/maven2 was cac hed in the local repository
  19. htc 8x android,htc8x怎么样 htc8x测评【图解】
  20. 月入过万——网店推广实战方法(第2版)

热门文章

  1. 【金仓数据库设置主键自增】
  2. 减肥盘货之忙女人减肥美食打算
  3. 塔菲尔曲线斜率的大小_电催化中Tafel斜率与决速步
  4. 我创业的这一年 九个月只有两个人
  5. matlab sym2,sym2poly   poly2sym
  6. math.pi java 是多少_math.pi 180 多少
  7. 3D动态烟花--HTML
  8. Nginx-Lua-FastDFS-GraphicsMagick动态图片缩略图
  9. matplotlib画各种图的方法(2)
  10. 彻底搭建云笔记(附插件)