高并发内存池 - central cache 结构设计
高并发内存池 - central cache 结构设计项目 gitee 链接 高并发内存池项目项目 github 链接 高并发内存池项目central cache 也是一个哈希桶结构并且映射关系与 thread cache 保持一致但是链接部分不再是自由链表而是一个名为SpanList的链表结构链表的存储对象是名为span的大内存块span中存储着切割好的小内存块链接而成的自由链表当 thread cache 申请时便返回的是自由链表的部分。这里有几点需要注意对于central cache线程与进程均共享一个所以设计为单例模式central cache有被多进程并发访问的可能多个 thread cache 同时没有资源同时请求所以要设计锁对于锁的位置需要分析一下多个 thread cache 可能申请的不是一个桶中的资源比如一个申请 6KB一个申请 8KB所以不能给 central cache 整体上锁而是只在哈希桶内部上锁确保桶只能在任意时刻被一个线程访问。下面我们深入探索一下谈谈为何这么设计而不是只困在应该这么设计为何要使用 Span如果还使用自由链表去设计 central cache 这一层就会产生一个致命的问题内存泄露假设 central cache 使用自由链表设计现在这个程序已经运行了很长时间多线程疯狂申请和释放 8 字节的内存。此时CentralCache 的 8 字节桶里有一个超级巨大的自由链表里面串着 100 万个 8 字节的空闲内存块总共占用了约 8MB 的物理内存。灾难发生了程序突然进入了低谷期不再需要这些小内存了。这时候你想把这 8MB 的内存还给操作系统或者借给需要 16 字节内存的桶用你该怎么做面对单纯的自由链表你绝望了。因为自由链表里的节点是打散的这 100 万个 8 字节内存块可能散布在 2000 个不同的物理页Page中每个页里只闲置了一半的内存另一半还在被其他线程使用。操作系统的规则是冷酷的你必须把完整的一页4KB或连续的几页原封不动地还给我我才能回收。你不能把“半页”内存还给我。结果你的内存池患上了“内存泄漏”的绝症。那 8MB 内存永远卡在 CentralCache 的巨大链表里既无法被其他大小的桶使用也无法还给操作系统只能白白浪费。结论单纯的自由链表只能“借出”内存很难完整地“收回”内存。此时的破局之道便是引入 Span。Span 申请的是连续的内存页块当 thread cache 需要内存是Span 对大块内存进行分割将分割后的小块内存进行分配对已经使用的小块内存数进行记录如果最后使用的内存都已归还说明此时这块连续的物理内存已经空闲可以将其打包再还给上层解决内存泄露与外部碎片的问题。总结实现内存的 “有借有还”核心目的ThreadCache为什么不需要 Span 因为ThreadCache是线程私有的它的设计哲学是“只管拿不管还”。它把内存囤在自己手里是为了极致的分配速度。就算内存浪费也只浪费在当前线程。CentralCache是全局共享的枢纽。它必须承担回收内存、降低系统整体内存水位的责任。Span 是内存回收的最小管理单元。没有 SpanCentralCache就无法把打散的内存重新聚合成完整的“页”还给 OS。解决外部碎片问题如果CentralCache直接用大链表长时间运行后物理内存会被切得稀碎这里空 8 字节那里空 16 字节导致程序明明有 100MB 空闲内存却无法申请一个连续的 1MB 内存块这就是外部碎片。使用Span内存总是以“连续的页”为单位申请和释放保证了物理内存的连续性极大地减少了外部碎片。提高分配效率局部性原理当ThreadCache来进货时CentralCache会优先从同一个Span里连续切出多个小块给它。这些小块在物理内存上是紧挨着的。当 CPU 去访问这些内存时能极大地提高CPU CacheL1/L2缓存的命中率从而提升整个程序的性能。如果是单纯的大自由链表拿出来的内存块在物理地址上可能是东一个西一个CPU 缓存命中率会很低。

相关新闻

Druid相关知识梳理

Druid相关知识梳理

文章目录 Druid 是什么? 核心功能(必背) 为什么要用 Druid?(优点) 一句话速记 总结 具体连接举例 1. 导入依赖 2. 核心区别 3. 代码实操 配置参数 创建Druid数据源(连接池) 4. 一句话总结 5. 多库延伸 为啥不用原生JDBC,非要用Druid 1. 原生JDBC致命缺点 2. Druid连接…

2026/7/24 21:39:38 阅读更多 →
deepseek 怎么导出 pdf?借助 AI 导出鸭,轻松解决各类导出格式困扰

deepseek 怎么导出 pdf?借助 AI 导出鸭,轻松解决各类导出格式困扰

DeepSeek导出PDF的技术纵深:从格式崩塌到结构化数据流转的工程进化 一、痛点:当“导出PDF”成为知识工程的最后一公里诅咒 在实际的AI工程化落地中,一个看似简单的功能——将AI生成内容导出为PDF,正在成为结构化工单、技术文档、科…

2026/7/24 21:39:38 阅读更多 →
HSTracker:3大功能让你的炉石传说胜率飙升50%

HSTracker:3大功能让你的炉石传说胜率飙升50%

HSTracker:3大功能让你的炉石传说胜率飙升50% 【免费下载链接】HSTracker A deck tracker and deck manager for Hearthstone on macOS 项目地址: https://gitcode.com/gh_mirrors/hs/HSTracker 还在为记不住对手的卡牌而烦恼?每次抽牌都像在赌博…

2026/7/24 21:39:38 阅读更多 →

最新新闻

ncmdumpGUI:Windows下一键解密网易云音乐NCM文件的完整指南

ncmdumpGUI:Windows下一键解密网易云音乐NCM文件的完整指南

ncmdumpGUI:Windows下一键解密网易云音乐NCM文件的完整指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了喜欢的歌曲…

2026/7/24 21:45:39 阅读更多 →
LTE站点DUS板卡副板DISABLED故障案例分析——EC总线异常导致小区退服及资源激活超时案例

LTE站点DUS板卡副板DISABLED故障案例分析——EC总线异常导致小区退服及资源激活超时案例

一、故障现象 LTE站点上报小区退服,告警显示为资源激活超时,如下: 查询小区当前是DISABLED,如下: 二、故障排查与处理过程 1、初步排查:RU设备及光路状态正常,如下: 2、深入排查:主板状态正常,副板DISABLED,如下: 3、后台操作:经分析,ru状态正常,但副板卡没起…

2026/7/24 21:45:39 阅读更多 →
TAS5780M音频DAC寄存器深度解析:从数字音量控制到时钟监控实战

TAS5780M音频DAC寄存器深度解析:从数字音量控制到时钟监控实战

1. 项目概述与核心价值在嵌入式音频系统开发中,我们常常会与德州仪器(TI)的TAS5780M这类高性能音频DAC打交道。它不仅仅是一个简单的数模转换器,更是一个集成了DSP、复杂音量控制、自动保护机制和丰富状态监控的片上系统。对于工程…

2026/7/24 21:45:39 阅读更多 →
如何精准计算AI提示词成本:TikTokenizer在线分词器终极指南

如何精准计算AI提示词成本:TikTokenizer在线分词器终极指南

如何精准计算AI提示词成本:TikTokenizer在线分词器终极指南 【免费下载链接】tiktokenizer Online playground for OpenAPI tokenizers 项目地址: https://gitcode.com/gh_mirrors/ti/tiktokenizer 你是否在使用ChatGPT、GPT-4等AI模型时,对费用计…

2026/7/24 21:45:39 阅读更多 →
CTF-NetA终极指南:3步掌握CTF流量分析神器

CTF-NetA终极指南:3步掌握CTF流量分析神器

CTF-NetA终极指南:3步掌握CTF流量分析神器 【免费下载链接】CTF-NetA CTF-NetA是一款专门针对CTF比赛的网络流量分析工具,可以对常见的网络流量进行分析,快速自动获取flag。 项目地址: https://gitcode.com/gh_mirrors/ct/CTF-NetA CT…

2026/7/24 21:45:39 阅读更多 →
爆款笔记改写避坑指南:5个技巧保留流量密码,让你的内容焕发新生

爆款笔记改写避坑指南:5个技巧保留流量密码,让你的内容焕发新生

爆款笔记改写避坑指南:5个技巧保留流量密码,让你的内容焕发新生 做小红书最扎心的事情是什么? 辛辛苦苦写的笔记没人看,抄了别人爆款标题还是石沉大海,好不容易蹭上热点结果流量惨淡。 其实问题可能不在于你不会写&…

2026/7/24 21:44:39 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻