共 9 篇文章 |
|
TCMalloc源码学习(四)(小内存块释放)pagemap_和pagemap_cache_1.判断这个Span所标识的对象是不是之前已经分配完了,若是就要把他从CentralFreeList的empty_ Spans List列表中挪出到nonempty_ Spans List中,因为我要把返回的内存对象给这个Span了。set (span-> start + span ->length - 1, span);if (list ->max_length() >ba... 阅836 转4 评0 公众公开 16-08-11 10:25 |
3 Span* span = nonempty_ .next;9 if ( span->objects == NULL) {10 // Move to empty list11 tcmalloc::DLL_Remove (span);如果仍然没有找到可用的Span,就要跳转到AllocLarge去获取了,PageHeap还有一个larger_ (SpanList类型),对于页数大于kMaxPages的内存不是放在free_而是larger_,从中查找合适Span的过程也是类似free_[i]链表... 阅386 转5 评0 公众公开 16-08-11 10:25 |
30 if (my_objects == prev_objects) {31 // Adjust last class to include this size32 class_to_size_[sc-1] = size;class_to_size_的映射关系是按照不同size的对齐大小累加而成的,而对齐大小由 alignment = AlignmentForSize(size); 计算出,代码如下:按照这样的公式 class_to_size_[1] = 8, class_to_size_[2] = 16, class_to_size_[3... 阅460 转3 评0 公众公开 16-08-11 10:24 |
当释放一个内存对象的时候,我们算出他所在页的页号,然后在central array中找到该页号对应的Span,Span可以获取对应的sizeclass,然后可以知道是小内存对象还是大内存对象。内存在线程本地的Cache和Central Free List之间的移动是以这些object为单位的,从Central Free list申请内存,会从中移动适量个数的object到线程本地Cache,线程本地Cac... 阅1181 转3 评0 公众公开 16-08-11 10:24 |
二. 线程缓存ThreadCache ThreadCache是线程缓存的对象,每个线程都有一个ThreadCache对象作为本线程的内存缓存池,当线程需要申请内存时,就从自己的ThreadCache中获取。PageHeap内存释放 1): 当CentralFreeList的某个Span所管理的内存都已经返回给这个Span后(有Span->refcount指示),CentralFreeList就将相应的Span管理的内存归还给P... 阅3212 转20 评0 公众公开 16-08-11 09:56 |
pool、object_pool、singleton_pool和pool_allocator/fast_pool_allocator.singleton_pool的接口与pool完全一致,但成员函数均是静态的,因此不需要声明singleton_pool的实例 ,直接用域操作符::来调用静态成员函数。typedef singleton_pool<struct pool_tag, sizeof(int)> spl;typedef boost::singleton_pool<singleton_pool_tag,siz... 阅577 转1 评0 公众公开 16-08-02 09:08 |
ptmalloc,tcmalloc和jemalloc内存分配策略研究。同样,如果中央堆也没内存了,就向中央内存分配器申请内存。简而言之,就是: 小内存(small class): 线程缓存bin -> 分配区bin(bin加锁) -> 问系统要中型内存(large class):分配区bin(bin加锁) -> 问系统要大内存(huge class): 直接mmap组织成N个chunk+全局huge红黑树维护(带... 阅3 转自lchjczw 公众公开 16-07-14 15:52 |
在tcmalloc中,<=32KB的对象被称作是小对象,>32KB的是大对象。在小对象中,<=1024bytes的对象以8n bytes分配,1025<size<=32KB的对象以128n bytes大小分配,比如:要分配20bytes则返回的空闲块大小是24bytes的,这样在<=1024的情况下最多浪费7bytes,>1025则浪费127bytes。大对象的分配就要简单多了,直接从heap free li... 阅137 转2 评0 公众公开 16-07-14 15:50 |
阅1 转自lchjczw 公众公开 16-07-14 15:50 |