我有一个进程在启动时会消耗大量内存,但在进程启动后会释放大部分内存。我在之后打印的 TCMalloc 统计信息中看到以下内容:
#012MALLOC: 16635888 ( 15.9 MiB) Bytes in use by application
#012MALLOC: + 0 ( 0.0 MiB) Bytes in page heap freelist
#012MALLOC: + 20007352 ( 19.1 MiB) Bytes in central cache freelist
#012MALLOC: + 26367680 ( 25.1 MiB) Bytes in transfer cache freelist
#012MALLOC: + 7030680 ( 6.7 MiB) Bytes in thread cache freelists
#012MALLOC: + 1978560 ( 1.9 MiB) Bytes in malloc metadata
#012MALLOC: = 72020160 ( 68.7 MiB) Actual memory used (physical + swap)
#012MALLOC: + 239607808 ( 228.5 MiB) Bytes released to OS (aka unmapped). ***
#012MALLOC: = 311627968 ( 297.2 MiB) Virtual address space used
在这里,我们看到有 ~228 MB “释放到操作系统”,但它也表明这仍然是进程虚拟地址空间的一部分。使用 ps aux 看到的 VSZ stat 在看到此日志记录后仍然很高这一事实证实了这一点。
当我使用 strace 运行相同的程序时,我可以看到:对 brk 的所有调用都在增加,并且对 munmap 的调用(就大小而言)不等于 mmap-ed 的数量(如上所示) . 更糟糕的是,随着我的进程执行后台工作,VSZ 随着时间的推移缓慢增加,并且日志显示(***)在记录这些统计信息时相应增加。
所以我的问题是:这个值代表什么?我的记忆是否被释放了?我能做些什么来防止这种消费增长?