1

我有 C Linux 应用程序,它使用 malloc、calloc、realloc 和 free 函数连续分配和释放内存(每秒大约 200 次分配/释放)。即使所有分配的内存都被释放(通过包装 *alloc 和 free 进行验证),VmSize、VmRSS 和 VmData 数量仍在不断增加,最终应用程序被 OOM 杀手杀死。

为什么 VmSize、VmRSS 和 VmData 不断增加?如果是内存管理问题,是否有避免这种情况的指针?

在 C 中看到了这个问题使用内存,但答案并没有解释 OOM 行为。

4

1 回答 1

0

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

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

您可能想尝试使用Boehm 的保守垃圾收集器- 即将您的所有内容替换mallocGC_MALLOC(或GC_MALLOC_ATOMIC&strdupGC_STRDUP)、您的freeGC_FREE等...

至少出于测试目的,可能通过 bash ulimit内置函数使用setrlimit(2) 。你想要- 可能有(设置这些限制明智地避免 OOM 杀手,并使你的-call by - 在内存耗尽时失败)。RLIMIT_ASRLIMIT_DATAmmapmalloc

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

您还可以实现自己的特定于应用程序的垃圾收集器(阅读该维基页面,它为您提供见解和术语);标记和紧凑算法将对抗碎片。

另请参阅有关内存碎片的问题。查看Plug工具。

于 2013-05-16T11:36:41.357 回答