我有一个应用程序,我一直试图让“内存泄漏”,我已经通过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在这里显示内存增长?
对此的任何帮助都将非常感谢....感谢一百万。
答案 0 :(得分:2)
如果SIZE
列没有增长,则表示您没有泄漏。
RSS
(驻留集大小)是主动使用的内存量,这个值随时间变化是正常的。如果您泄漏,SIZE
会随着时间的推移而增长(RSS
可以保持不变,甚至缩小。)
答案 1 :(得分:1)
UMEM_DEBUG=default, UMEM_LOGGING=transaction LD_PRELOAD=libumem.so.1.
,这是我用来调试solaris内存泄漏问题的选项,它对我来说很好。RedHat REL version 5
和solaris SunOS 5.9/5.10
的经验,linux进程内存占用量不会逐渐增加,相反它似乎在需要额外内存并将它们用于a时占用大块内存长跑。 (纯粹基于观察,尚未对其内存分配机制进行任何研究)。所以你应该发送更多的数据(10K消息不大)。 dtrace
工具来检查solaris的内存问题。杰克