我有一个应用程序,我一直试图让“无内存泄漏”,我已经使用 Totalview 的 MemoryScape 在 Linux 上进行了可靠的测试,没有发现泄漏。我已将应用程序移植到 Solaris (SPARC) 并且我试图找到一个泄漏...
我在 Solaris 上使用过“LIBUMEM”,在我看来它也没有泄漏......
这是我的启动命令:
LD_PRELOAD=libumem.so UMEM_DEBUG=audit ./link_outbound config.ini
然后我立即检查了 Solaris 上的 PRSTAT 以查看启动内存使用情况:
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
9471 root 44M 25M sleep 59 0 0:00:00 1.1% link_outbou/3
然后我开始向应用程序发送数千条消息……随着时间的推移,PRSTAT 增长了……
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
9471 root 48M 29M sleep 59 0 0:00:36 3.5% link_outbou/3
就在我最终停止它之前:
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
9471 root 48M 48M sleep 59 0 0:01:05 5.3% link_outbou/3
现在有趣的部分是当我在这个应用程序上使用 LIBUMEM 时,它显示 48 MB 内存,如下所示:
pgrep link
9471
# gcore 9471
gcore: core.9471 dumped
# mdb core.9471
Loading modules: [ libumem.so.1 libc.so.1 ld.so.1 ]
> ::findleaks
BYTES LEAKED VMEM_SEG CALLER
131072 7 ffffffff79f00000 MMAP
57344 1 ffffffff7d672000 MMAP
24576 1 ffffffff7acf0000 MMAP
458752 1 ffffffff7ac80000 MMAP
24576 1 ffffffff7a320000 MMAP
131072 1 ffffffff7a300000 MMAP
24576 1 ffffffff79f20000 MMAP
------------------------------------------------------------------------
Total 7 oversized leaks, 851968 bytes
CACHE LEAKED BUFCTL CALLER
----------------------------------------------------------------------
Total 0 buffers, 0 bytes
>
如果我通过应用程序发送 10 条消息或 10000 条消息,“7 个超大泄漏,851968 字节”永远不会改变......它始终是“7 个超大泄漏,851968 字节”。这是否意味着应用程序没有根据“libumem”泄漏?
令人沮丧的是,在 Linux 上,内存保持不变,从不改变……但在 Solaris 上,我看到了这种缓慢但稳定的增长。
知道这意味着什么吗?我正确使用 libumem 吗?什么可能导致 PRSTAT 在这里显示内存增长?
对此的任何帮助将不胜感激......感谢一百万。