1,释放速度控制

在将一个Span删除掉的时候,会优先将它加入到normal队列中,这之后会尝试从normal队列中释放一部分同样大小的内存给系统。

释放内存给系统的时候,tcmalloc使用了一个延时回收机制,如果这次一个page都没释放,那么默认要等1<<18个page(4k的page的话,是1GB)的释放请求之后才会真正做释放操作;如果这次释放了n个page,那么要等1000 * n 个page释放请求之后才会真正做释放操作,这个地方有个上限,上限是1<<20个page(4k的page的话,是4GB)。

这样做的原因,可能是想积攒若干个连续的页再释放,因为反复向操作系统释放和申请内存是一个很重的操作。

2,每个线程cache的大小

默认情况下,每个线程的Cache上线是4MB:

static const size_t kMaxThreadCacheSize = 4 << 20;

每个线程的Cache下限是512KB

static const size_t kMinThreadCacheSize = kMaxSize * 2;

默认情况下,所有线程的Cache上限是32MB:

static const size_t kDefaultOverallThreadCacheSize = 8u * kMaxThreadCacheSize;

MallocExtension::GetStats的输出:

MALLOC:     3966097008 ( 3782.4 MiB) Bytes in use by application

MALLOC: +            0 (    0.0 MiB) Bytes in page heap freelist

MALLOC: +     25925136 (   24.7 MiB) Bytes in central cache freelist

MALLOC: +      8526848 (    8.1 MiB) Bytes in transfer cache freelist

MALLOC: +     24049536 (   22.9 MiB) Bytes in thread cache freelists

MALLOC: +     18952344 (   18.1 MiB) Bytes in malloc metadata

MALLOC:   ------------

MALLOC: =   4043550872 ( 3856.2 MiB) Actual memory used (physical + swap)

MALLOC: +   8285011968 ( 7901.2 MiB) Bytes released to OS (aka unmapped)

MALLOC:   ------------

MALLOC: =  12328562840 (11757.4 MiB) Virtual address space used

MALLOC:

MALLOC:         107257              Spans in use

MALLOC:             67              Thread heaps in use

MALLOC:           8192              Tcmalloc page size

各个数字的计算:

1, Virtual address space used

const uint64_t virtual_memory_used = (stats.pageheap.system_bytes  // pageheap通过TCMalloc_SystemAlloc分配的内存

+ stats.metadata_bytes);  // tcmalloc元数据占用的内存

stats.pageheap.system_bytes 内存只增不减,因为tcmalloc在内存不足时会优先利用madvise向OS释放的内存

2,Actual memory used (physical + swap)

const uint64_t physical_memory_used = (virtual_memory_used

- stats.pageheap.unmapped_bytes);  // 通过madvise向OS释放的内存

Actual memory used 是指所有向系统申请的内存减去向系统释放的内存。

3,Bytes in use by application:

const uint64_t bytes_in_use_by_app = (physical_memory_used

- stats.metadata_bytes

- stats.pageheap.free_bytes  // pageheap所有normal队列中的span长度之和

- stats.central_bytes

- stats.transfer_bytes

- stats.thread_bytes);

Bytes in use by application是指所有被应用使用的内存(所有物理内存减去所有Free list中的内存)。

Unmapped Bytes的含义是那些已经通过madvise释放给操作系统,但是依然在returned链表上的span的长度之和。

TCMalloc - 细节的更多相关文章

  1. golang ---tcmalloc浅析

    总体结构 在tcmalloc内存管理的体系之中,一共有三个层次:ThreadCache.CentralCache.PageHeap,如上图所示.分配内存和释放内存的时候都是按从前到后的顺序,在各个层次 ...

  2. 图解 TCMalloc

    https://zhuanlan.zhihu.com/p/29216091 图解 TCMalloc hellocode 永远年轻   693 人赞了该文章 前言 TCMalloc 是 Google 开 ...

  3. TCMalloc源码学习(四)(小内存块释放)

    pagemap_和pagemap_cache_ PageHeap有两个map,pagemap_记录某一内存页对应哪一个span,显然可能多页对应一个span,pagemap_cache_记录某一内存页 ...

  4. TCMalloc源码学习(三)(小块内存分配)

    线程本地cache 线程本地cache对应的是类 ThreadCache,每一个thread一个实例,初始化代码在static函数CreateCacheIfNecessary中, 在该线程第一次申请内 ...

  5. redis数据存储的细节

    redis是一个K-V NoSql非关系型数据库,redis有物种数据类型,分别是String,Hash,list,set,zset:这五种类型都是针对K-V中的V设计的. 1.总体介绍:关于redi ...

  6. Vue.js 和 MVVM 小细节

    MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...

  7. vue2.0实践的一些细节

    最近用vue2.0做了个活动.做完了回头发现,好像并没有太多的技术难点,而自己好像又做了比较久...只能说效率有待提升啊...简单总结了一些比较细节的点. 1.对于一些已知肯定会有数据的模块,先用一个 ...

  8. 深入理解JS 执行细节

    javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链等 ...

  9. javaScript中的小细节-script标签中的预解析

    首先介绍预解析,虽然预解析字面意思很好理解,但是却是出坑出的最多的地方,也是bug经常会有的地方,利用好预解析的特性可以解决很多问题,并且提高代码的质量及数量,浏览器在解析代码前会把变量的声明和函数( ...

随机推荐

  1. iOS7的十个更“佳”:简洁直观更受青睐

    转自:http://www.25pp.com/news/news_27792.html iOS7自发布以来一直是褒贬不一,虽然苹果还只是发布了第二个测试版,但普通用户早已经在纠结到底该不该升级iOS7 ...

  2. VUE--v-on修饰符

    1.v-on的修饰符 .stop:阻止事件冒泡 <div @click="getTitle"> 阿Q <button @click="getBut&qu ...

  3. MySQL Other--mysql_config_editor学习使用

    mysql_config_editor工具 为避免MySQL明文密码出现在脚本或命令中,从MySQL5.6开始提供了mysql_config_editor工具,可以将数据库连接信息进行加密并保存到用户 ...

  4. 安装Ubuntu后需要做的事

    卸载软件 纸牌 麻将 扫雷 数独 火狐 邮件 扫描 拍照 照片 视频 计划 日历 打印 备份 计算器 亚马逊 电源统计 音乐播放 远程桌面 To Do LibreOffice 换下载源 装机的时候下载 ...

  5. pdf的使用遇到的问题

    http://blog.csdn.net/atluckstar/article/details/77688972 回答网友提问  2015-7-28 因为好多人问能不能显示中文的问题,我总结大致分为两 ...

  6. 孪生网络(Siamese Network)在句子语义相似度计算中的应用

    1,概述 在NLP中孪生网络基本是用来计算句子间的语义相似度的.其结构如下 在计算句子语义相似度的时候,都是以句子对的形式输入到网络中,孪生网络就是定义两个网络结构分别来表征句子对中的句子,然后通过曼 ...

  7. html--前端JavaScript基本内容

    一.JavaScript 变量 在 JavaScript 中创建变量通常称为"声明"变量. 使用 var 关键词来声明变量. 注意: 1.变量必须以字母开头 2.变量也能以 $ 和 ...

  8. 【PL/SQL】左侧窗口没了

  9. [Python] Python 获取中文的首字母 和 全部拼音首字母

    Python 获取中文的首字母 和 全部拼音首字母 代码如下: import pinyin def getStrAllAplha(str): return pinyin.get_initial(str ...

  10. 网络协议 16 - DNS 协议

    为什么在地址栏输入域名,就能直接访问到对应服务器?全局负载均衡和内部负载均衡又是什么?这些都和 DNS 解析息息相关,让我们一起来解密 DNS 解析.     其实说起 DNS 解析,应该都知道它很像 ...