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. vue+element表单校验功能

    要实现这个功能其实并不难,element组件直接用就可以, 但是我在使用过程中碰到了几个坑,就记录下来,分享给大家,避免落坑,话不多说,直接上过程...... 表单校验功能:   实现这个功能,总共分 ...

  2. combox绑定数据

    HSMobile_Function.HSMobile_ProjectIDSelect(ProjectID, out dt_Machine);//取出表数据            comboBox_Ma ...

  3. pgsql主备搭建及切换

    二.主从搭建 2.1测试目标 测试postgresql主从搭建安装过程 2.2环境准备 实例级别的复制 流复制主库可读写,但从库只允许查询不允许写人, 而逻辑复制的从库可读写 流复制实验环境 主机 主 ...

  4. Mysql-5.5版本搭建实例的部分库的从库

    由于业务需要在Mysql实例中创建部分库的从库,已有的Mysql实例的版本是mysql-5.5.49,是一个非常老的版本. 本文档涉及到服务器中运行多实例和构建实例中部分库的从库. 服务器 mysql ...

  5. centos7安装mysql注意点

    yum安装yum -y install mariadb-server 启动服务systemctl start mariadb.service 开机自动启动systemctl enable mariad ...

  6. html5表单上传控件Files筛选指定格式的文件:accept属性过滤excel文件

    摘自:http://blog.csdn.net/jyy_12/article/details/9851349 (IE9及以下不支持下面这些功能,其它浏览器最新版本均已支持.) 1.允许上传文件数量 允 ...

  7. HDP 3.1.0 集成 Sqoop2

    HDP 3.1.0 集成 Sqoop2 本文原始地址:https://sitoi.cn/posts/65261.html 环境 由三台主机组成的 HDP 3.1.0 集群 配置好时间同步 步骤 下载 ...

  8. Consul 知识点

    平时开发时,一般使用consul dev模式,开发模式下kv存储不会持久化存储,全在内存中(重启consul就丢了!),所以一般建议yml配置文件内容,在项目中单独存一个文件,启动调试时,直接把配置文 ...

  9. C#中的函数(三)参数传递及返回值

    接前面二篇,继续开始新的研究 前面忘了说什么是主调函数与被调函数 主调函数:执行调用其它函数语句所在的函数 被调函数:被其它函数所调用的函数 简单说就是一个是发起调用者,另一个是被调用者 写个小例子说 ...

  10. mybatis框架-choose when otherwise 的使用

    需求:模拟实际业务情况,传入多条件进行查询 /** * 需求:模拟实际业务,用户传入多个条件,进行用户列表信息的查询 * @param roleids * @return */ public List ...