关于 tcmalloc 与 jemalloc

2018-11-19 15:13:29 +08:00
 Buffer2Disk

坛子里面有没有深度使用过这两个内存管理器的大佬? 最近一直在做内存优化,具体场景如下: 业务系统在默认使用 ptmalloc 情况下,内存持续增长; 业务系统线程数恒定不变,基本上不涉及频繁创建与销毁。

分别使用三种内存管理器 1 天半以后,观察内存增长情况如下:

(1) ptmalloc : 内存增长较缓慢,但是每次增加的内存都很多,并且释放内存返还给操作系统的情况很少

(2) tcmalloc : 内存增长很快,而且每次增长的数值都很小,属于短平快的类型,同样释放内存返还给操作系统的情况很少

(3) jemalloc : 初始情况下内存增长非常快,数值很大,但是到了一定量以后,内存维持在一定量上下浮动,释放内存返还给操作系统的情况很多

有没有人能分析分析

7204 次点击
所在节点    问与答
9 条回复
zk8802
2018-11-19 15:27:35 +08:00
据说 jemalloc 在面对内存碎片时比另外两个的表现好得多。你可以分析一下业务系统的内存申请与释放的情况,看看是不是容易导致堆内存碎片的出现。
Buffer2Disk
2018-11-19 15:49:28 +08:00
@zk8802 应该是的,我感觉 tcmalloc 内存一直在增长 4KB 的倍数,就没释放过
P0P
2018-11-19 16:55:24 +08:00
tcmalloc 可以手动调用方法还给操作系统内存,其他几个就不清楚了
trait
2018-11-19 17:04:55 +08:00
jemalloc 上个月之前一直是 Rust 语言的默认管理器,因为跨平台的原因才从语言本身移除改为 OS 默认( rust 支持用户自己挂载管理器)
zk8802
2018-11-19 19:39:27 +08:00
@Buffer2Disk 先确定没有内存泄漏的情况发生。在选择合适的内存管理器的同时,也要记得优化一下业务系统的内存分配。内存碎片往往可以通过创建 sub heap 或者更换内存管理器的方法解决。
gulucn
2018-11-19 21:53:38 +08:00
tcmalloc 需要释放内存还给操作系统可以尝试 更改 https://gperftools.github.io/gperftools/tcmalloc.html 的 TCMALLOC_RELEASE_RATE 测试一下
Buffer2Disk
2018-11-20 10:18:45 +08:00
@zk8802 业务系统的内存泄漏优化了一个月了,感觉应该没啥了,主要就是进程的内存随着时间一直增长,所以才想着更换内存管理器
Buffer2Disk
2018-11-20 10:21:30 +08:00
@gulucn 原来是这样,试了下,默认参数情况下,jemalloc 内存释放给系统的速度应该比 tcmalloc 要快,可能是 2 者的策略不同。
Buffer2Disk
2018-11-20 10:21:43 +08:00
网上说 jemalloc 管理内存碎片方面比 tcmalloc 更好,这个还没感受出来

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/509275

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX