TCMalloc - 细节
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 - 细节的更多相关文章
- golang ---tcmalloc浅析
总体结构 在tcmalloc内存管理的体系之中,一共有三个层次:ThreadCache.CentralCache.PageHeap,如上图所示.分配内存和释放内存的时候都是按从前到后的顺序,在各个层次 ...
- 图解 TCMalloc
https://zhuanlan.zhihu.com/p/29216091 图解 TCMalloc hellocode 永远年轻 693 人赞了该文章 前言 TCMalloc 是 Google 开 ...
- TCMalloc源码学习(四)(小内存块释放)
pagemap_和pagemap_cache_ PageHeap有两个map,pagemap_记录某一内存页对应哪一个span,显然可能多页对应一个span,pagemap_cache_记录某一内存页 ...
- TCMalloc源码学习(三)(小块内存分配)
线程本地cache 线程本地cache对应的是类 ThreadCache,每一个thread一个实例,初始化代码在static函数CreateCacheIfNecessary中, 在该线程第一次申请内 ...
- redis数据存储的细节
redis是一个K-V NoSql非关系型数据库,redis有物种数据类型,分别是String,Hash,list,set,zset:这五种类型都是针对K-V中的V设计的. 1.总体介绍:关于redi ...
- Vue.js 和 MVVM 小细节
MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...
- vue2.0实践的一些细节
最近用vue2.0做了个活动.做完了回头发现,好像并没有太多的技术难点,而自己好像又做了比较久...只能说效率有待提升啊...简单总结了一些比较细节的点. 1.对于一些已知肯定会有数据的模块,先用一个 ...
- 深入理解JS 执行细节
javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链等 ...
- javaScript中的小细节-script标签中的预解析
首先介绍预解析,虽然预解析字面意思很好理解,但是却是出坑出的最多的地方,也是bug经常会有的地方,利用好预解析的特性可以解决很多问题,并且提高代码的质量及数量,浏览器在解析代码前会把变量的声明和函数( ...
随机推荐
- Clang交叉编译初识
最近工作中要编译一个第三方的C库用于iOS端使用,我直接在Mac OS的终端中./configure & make & make install常规走下来,却无法在真机iOS上使用,提 ...
- 【转载】Gradle学习 第四章:安装Gradle
转载地址:http://ask.android-studio.org/?/article/16 4.1. Prerequisites 前提条件Gradle requires a Java JDK or ...
- docker私有仓库操作(搭建、运行、添加、删除)
目录 运行私有仓库 TIPS: 上传 把镜像放入私有仓库 验证 查看 TIPS: 垃圾回收 问题排查 参考:https://yeasy.gitbooks.io/docker_practice/cont ...
- (原)netbeans中使用libtorch
转载请注明处处: https://www.cnblogs.com/darkknightzh/p/11479330.html 说明:第一种方式在netbeans中无法debug代码,设置了断点也不会在断 ...
- MySQL数据物理备份之xtrabackup
percona-xtrabackup 它是开源免费的支持MySQL 数据库热备份的软件,它能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份.它不暂停服务创建Innodb热备份: 为mysql ...
- 解决Mac下SourceTree每次都让输入密码的问题
在Mac上操作sourcetree当pull和push时每次都是让输入密码,非常烦人,虽然大概知道是因为SSH什么的问题,但搜索百度也没发现解决办法. 于是乎搜索谷歌,发现如下解决办法. Source ...
- 使用ARP获取局域网内设备IP和MAC地址
根据Arp列表数据,查询本地设备在线状态 使用 arp -a 获得所有内网地址,首先看Mod对象 public struct MacIpPair { public string HostName; p ...
- 201871010102-常龙龙《面向对象程序设计(java)》第四周学习总结
博文正文开头: 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu ...
- 201871010133-赵永军《面向对象程序设计(java)》第二周学习总结
201871010133-赵永军<面向对象程序设计(java)>第二周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这 ...
- python抓取网站提示错误ssl.SSLCertVerificationError处理
python在抓取制定网站的错误提示:ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify ...