内存池的实现与场景分析

简介: 内存池的实现与场景分析

内存池场景分析

不同的场景下,内存池的设计是不一样的,以下是几个举例:

  1. 短链接和长连接。在kv存储中,经常以短链接为key,长链接为value。长链接的长度一般是固定的,短链接的长度一般也在某个区间内。我们在这种场景下只需要考虑固定分配的内存块。大块内存,不均匀内存等情况是不需要考虑的。
  2. 为每一个连接单独创建内存池。这种情况下内存池建立的时间和释放的时间和建立连接、断开连接的时点是一致的,内存块的大小根据业务场景的不同而定。
  3. 实现文章的存储。每篇文章的长短大小不一,需要的内存大小也不一。

我们设计内存池的不需要考虑得面面俱到,能把单一的场景解决得很好即可。比较通用且开源的内存池框架有jemalloc和tcmalloc等。

内存池的好处

  1. 避免了频繁的内存分配
  2. 避免了频繁分配内存导致的碎片化空隙。

针对固定块建立内存池

内存池包括管理用的结构体、内存页,以及内存页里被分割为多个小块。

设计内存池结构体

设计内存池结构体。内存池结构体的属性包括内存块大小、待使用的内存块的数量、下一个要使用的内存块的指针、内存页的指针。

设计内存池接口

包括初始化、销毁、分配、释放。

实现内存池的接口

内存页相关

首先,要先声明页的大小。

初始化内存池

先申请一块内存页。需要注意的是,内存页会被切割为多个内存块。每个内存块的前4个字节存放的是下一个内存块的地址,由此形成了一个单向链表便于后续管理。此处注意二级指针的用法,二级指针所指向的空间只能放置指针。

销毁内存池

直接销毁内存页即可

申请内存块

内存块是本身就存在的。申请内存块的本意是将下一个要使用的内存块的指针取出,取出完成后更新指针。

释放内存块

释放的时候,记得把被释放内存块里存储的指针指向释放前的空闲块,以便在利用该空闲块后,能接着使用本该使用的内存块。

运行结果

为每一个连接单独创建内存池

上一种内存池情况针对的情况是大小固定、释放时间不固定。这种情况是大小不固定,释放时间固定。当连接断开的时候,内存池也随之释放,所以只需要设计销毁函数不需要设计释放函数。其关键是将内存页串为链表,以及统一释放。

定义内存页节点和内存页链表管理结构体

内存页节点结构体包括:内存页剩余空间的起始地址,下一个内存页地址,刚好超出内存页末尾的地址。

内存页链表管理结构体包括:第一个内存页节点,当前使用的内存页节点,内存页的大小。

初始化内存页管理结构体

申请一个内存页,在内存页头部存放一个内存页结构体,用于形成管理对应的内存页,以及寻找下一个内存页。

同时修改内存页管理结构体。

销毁内存页节点

和正常地链表释放没有区别

申请内存使用

逻辑是如果在当前内存页可以申请到足够的内存空间直接申请。如果申请不到那么循环遍历之后的节点的空间是否足够。如果一直没有足够的空间,那么建立新的内存页节点。

运行结果

目录
相关文章
|
3月前
|
监控 Java
如何使用VisualVM分析内存泄漏?具体流程看这里
如何使用VisualVM分析内存泄漏?具体流程看这里
|
4月前
|
安全 Linux 编译器
内存泄漏检测组件的分析与实现(linux c)-mtrace工具使用
内存泄漏产生原因 在堆上使用malloc/remalloc/calloc分配了内存空间,但是没有使用free释放对应的空间。
77 0
|
29天前
|
缓存 Java
Java中循环创建String对象的内存管理分析
Java中循环创建String对象的内存管理分析
24 2
|
1天前
|
存储 Arthas 监控
JVM工作原理与实战(三十):堆内存状况的对比分析
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了堆内存状况的对比分析、产生内存溢出的原因等内容。
|
3天前
|
缓存 Linux
linux性能分析之内存分析(free,vmstat,top,ps,pmap等工具使用介绍)
这些工具可以帮助你监视系统的内存使用情况、识别内存泄漏、找到高内存消耗的进程等。根据具体的问题和需求,你可以选择使用其中一个或多个工具来进行内存性能分析。注意,内存分析通常需要综合考虑多个指标和工具的输出,以便更好地理解系统的行为并采取相应的优化措施。
21 6
|
6天前
|
机器学习/深度学习 分布式计算 数据处理
Spark是一个基于内存的通用数据处理引擎,可以进行大规模数据处理和分析
【5月更文挑战第2天】Spark是一个基于内存的通用数据处理引擎,可以进行大规模数据处理和分析
21 3
|
8天前
|
监控 算法 测试技术
【Go语言专栏】Go语言的性能优化与内存分析
【4月更文挑战第30天】本文探讨了Go语言的性能优化策略和内存分析方法。性能优化原则包括基准测试、分析瓶颈、避免过早优化和持续监控。优化策略涉及减少内存分配、避免内存逃逸、利用并发、优化算法和数据结构以及减少系统调用。内存分析借助于Go的`pprof`工具、内存分配跟踪和第三方工具,以发现内存泄漏和管理问题。通过这些方法,开发者能提升Go程序效率和资源利用率。
|
11天前
|
缓存 Java Android开发
安卓开发中的内存泄漏分析与优化策略
【4月更文挑战第27天】 在移动应用开发领域,性能优化始终是提升用户体验的关键因素之一。特别是对于安卓平台,由于设备的硬件配置差异较大,良好的内存管理对于保证应用流畅运行尤为重要。本文将深入探讨安卓开发中常见的内存泄漏问题,并提供一系列检测和解决内存泄漏的实用策略。通过对工具的使用、代码实践以及系统架构设计的多维度分析,旨在帮助开发者有效避免和处理内存泄漏,确保应用性能稳定。
|
15天前
|
Java
【Java基础】面向对象和内存分析
【Java基础】面向对象和内存分析
15 0
|
15天前
|
存储 Java Shell
Android系统 实现低内存白名单防LMK原理分析
Android系统 实现低内存白名单防LMK原理分析
26 0