坛子里面有没有深度使用过这两个内存管理器的大佬? 最近一直在做内存优化,具体场景如下: 业务系统在默认使用 ptmalloc 情况下,内存持续增长; 业务系统线程数恒定不变,基本上不涉及频繁创建与销毁。
分别使用三种内存管理器 1 天半以后,观察内存增长情况如下:
(1) ptmalloc : 内存增长较缓慢,但是每次增加的内存都很多,并且释放内存返还给操作系统的情况很少
(2) tcmalloc : 内存增长很快,而且每次增长的数值都很小,属于短平快的类型,同样释放内存返还给操作系统的情况很少
(3) jemalloc : 初始情况下内存增长非常快,数值很大,但是到了一定量以后,内存维持在一定量上下浮动,释放内存返还给操作系统的情况很多
有没有人能分析分析
1
zk8802 2018-11-19 15:27:35 +08:00 via iPhone
据说 jemalloc 在面对内存碎片时比另外两个的表现好得多。你可以分析一下业务系统的内存申请与释放的情况,看看是不是容易导致堆内存碎片的出现。
|
2
Buffer2Disk OP @zk8802 应该是的,我感觉 tcmalloc 内存一直在增长 4KB 的倍数,就没释放过
|
3
P0P 2018-11-19 16:55:24 +08:00
tcmalloc 可以手动调用方法还给操作系统内存,其他几个就不清楚了
|
4
trait 2018-11-19 17:04:55 +08:00
jemalloc 上个月之前一直是 Rust 语言的默认管理器,因为跨平台的原因才从语言本身移除改为 OS 默认( rust 支持用户自己挂载管理器)
|
5
zk8802 2018-11-19 19:39:27 +08:00 via iPhone
@Buffer2Disk 先确定没有内存泄漏的情况发生。在选择合适的内存管理器的同时,也要记得优化一下业务系统的内存分配。内存碎片往往可以通过创建 sub heap 或者更换内存管理器的方法解决。
|
6
gulucn 2018-11-19 21:53:38 +08:00
tcmalloc 需要释放内存还给操作系统可以尝试 更改 https://gperftools.github.io/gperftools/tcmalloc.html 的 TCMALLOC_RELEASE_RATE 测试一下
|
7
Buffer2Disk OP @zk8802 业务系统的内存泄漏优化了一个月了,感觉应该没啥了,主要就是进程的内存随着时间一直增长,所以才想着更换内存管理器
|
8
Buffer2Disk OP @gulucn 原来是这样,试了下,默认参数情况下,jemalloc 内存释放给系统的速度应该比 tcmalloc 要快,可能是 2 者的策略不同。
|
9
Buffer2Disk OP 网上说 jemalloc 管理内存碎片方面比 tcmalloc 更好,这个还没感受出来
|