Linux c应用程序内存使用情况

时间:2013-05-16 10:09:40

标签: c linux memory malloc out-of-memory

我有C Linux应用程序,它使用malloc,calloc,realloc和amp;来连续分配和释放内存(每秒大约200个alloc / free)。免费功能。即使释放了所有分配的内存(通过包装* alloc和free验证),VmSize,VmRSS& VmData数字不断增加,最终应用程序被OOM杀手杀死。

为什么VmSize,VmRSS& VmData继续增加?如果是内存管理问题,有什么指针可以避免这种情况吗?

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

1 个答案:

答案 0 :(得分:0)

您应该首先使用valgrind(以调试潜在的难以发现的内存泄漏或错误行为)。不要忘记使用gcc -Wall -g进行编译(然后,当它工作时,使用-Wall -O);当然,改进你的代码直到没有给出警告。

您可能(如果算法适合)尝试(有用地)分配例如存储区域。要么是2的幂,要么是2的幂的3倍[可能减2或3个字];至少试着避​​免太多不同的随机分配大小。

您可能想尝试使用Boehm's conservative garbage collector - 即将所有malloc替换为GC_MALLOC(或GC_MALLOC_ATOMIC& strdup替换GC_STRDUP ),您的freeGC_FREE等...

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

您可能希望使用接受-fsanitize=address的GCC 4.8进行编译。

您还可以实施自己的应用程序garbage collector(阅读wikipage,它会为您提供见解和术语); mark & compact algorithm将对抗碎片化。

另见this question about memory fragmentation。查看Plug工具。