2013-05-16 72 views
1

我有C Linux应用程序,它使用malloc,calloc,realloc &连续分配和释放内存(大约200 alloc /每秒)免费功能。尽管所有分配的内存都被释放(通过包装* alloc和空闲来验证),但VmSize,VmRSS VmData数量仍在增加,最终应用程序被OOM杀手杀死。Linux c应用程序内存使用情况

为什么VmSize,VmRSS & VmData不断增加?如果是内存管理问题,任何指针可以避免这种情况?

我看到这个Problem usage memory in C,但答案没有解释OOM行为。

+5

我*强烈*建议您通过** valgrind **运行它,而不是依靠宏'日志输出。指出潜在泄漏的位置非常有效,听起来你有一个,无论你是否同意,它的价值检查。 – WhozCraig

+1

我使用的第一个工具是valgrind,但它没有帮助,因为应用程序代码没有泄漏 –

+0

您是否在运行时库实现之外的代码中使用**任何**第三方库? – WhozCraig

回答

0

您应该首先使用valgrind(调试潜在的难以发现内存泄漏或不正常行为)。不要忘记与gcc -Wall -g编译(然后,当它工作,使用-Wall -O);当然,改善你的代码直到没有警告。你可能(如果算法合适的话)尝试(有用地)分配例如内存区域。两次幂,或两次幂的三次[也许减去2或3个字];至少要尽量避免分配太多不同的随机大小。

您可能需要使用Boehm's conservative garbage collector尝试 - 即替换所有mallocGC_MALLOC(或GC_MALLOC_ATOMIC & strdupGC_STRDUP),您freeGC_FREE,等...

至少出于测试目的,使用setrlimit(2)也许通过bash ulimit内置。你想RLIMIT_AS - 可能与RLIMIT_DATA(设置这些限制明智地避免了OOM杀手,并使您的mmap-调用malloc - 内存耗尽时失败)。

您可能希望使用GCC 4.8进行编译,该GCC 4.8接受-fsanitize=address。你也可以实现你自己的应用程序特定的garbage collector(阅读wikipage,它给你的见解和术语);一个mark & compact algorithm将与碎片战斗。请参阅this question about memory fragmentation。查看Plug工具。

+0

感谢您的有用链接。但我决定尝试使用自定义内存分配器来避免分配和释放。 –

+0

随时upvote和/或接受我的答案,并告诉我们,如果你的分配器解决这个问题(也许不是)... –