内存管理Go

内存管理

TCMalloc架构

1.TCMalloc的架构

TCMalloc三层架构逻辑:

  • ThreadCache:线程缓存
  • CentralFreeList:中央缓存
  • PageHeap:堆内存

2.堆内存分配

堆内存分配分别有大对象和小对象:

  • 小对象:小于等于256kb
  • 大对象:大于256kb
小对象的分配过程

1.ThreadCache的alloc充足,则直接分配小对象所需内存;

2.线程缓存mcache的alloc不足,则去中央缓存mcentral获取一个mspan,再分配小对象所需的内存;

3.线程缓存mcache的alloc不足,且中央缓存mcentral不足,则去逻辑处理结构的p.pagecache分配,如果还不足,直接去堆上mheap获取一个mspan,再分配小对象所需内存。

大对象的分配过程

1.逻辑处理结构的pagecache充足,则直接分配大对象所需内存;

2.逻辑处理器结构的pagecache不足,则直接去堆上mheap分配大对象所需内存;

TCMalloc组件

在这里插入图片描述

TCMalloc(Thread-Caching Malloc)是 Google 开发的一种高效的内存分配器,旨在减少多线程环境下的内存分配开销。它通过对内存分配进行优化,来减少锁的竞争和提高内存分配效率。TCMalloc 的主要组件包括:

1. Thread-local Cache(线程本地缓存)

  • 每个线程都拥有自己的本地内存缓存,用于处理小的内存分配请求(通常是 32 KB 以下的内存块)。
  • 通过维护线程私有的缓存来避免频繁的跨线程锁竞争。当一个线程需要分配内存时,它首先会检查自己的本地缓存,从中获取内存,而无需与其他线程竞争全局内存池。
  • 如果线程缓存中没有合适的内存块,则会向中央缓存请求。

2. CentralCache

是所有线程共享的缓存,也是保存的空闲内存块链表,链表的数量与ThreadCache中链表数量相同,当ThreadCache内存块不足时,可以从CentralCache中获取,当ThreadCache内存块多时,可以放回CentralCache。由于CentralCache是共享的,所以他的访问需要加锁。

3. Page Heap

是堆内存的抽象,PageHeap存的也是若干链表,链表保存的是Span,当CentralCache没有内存时,会从PageHeap中获取,把1个Span拆成若干内存块,添加到对应大小的链表中,当CentralCache内存多的时候,会放回PageHeap。

4. Span(内存跨度)

  • TCMalloc 使用 Span 结构来表示连续的内存页。Span 是 Page Heap 中内存管理的基本单元,用于追踪和分配内存块。
  • 一个 Span 可以包含一个或多个页,具体取决于分配的内存大小。较小的分配会占用较少的页数,而较大的分配则会占用更多的页数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

席万里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值