我有一个C Linux应用程序,它使用malloc、calloc、realloc&免费功能。即使所有分配的内存都被释放(通过包装*alloc和free来验证(,VmSize、VmRSS&VmData的数量不断增加,最终应用程序被OOM杀手杀死。
为什么VmSize、VmRSS&VmData持续增长?如果是内存管理问题,有什么可以避免的指针吗?
我在C中看到了这个问题使用内存,但答案并不能解释OOM行为。
您应该首先使用valgrind(调试潜在的难以发现的内存泄漏或不当行为(。不要忘记使用gcc -Wall -g
编译(然后,当它工作时,使用-Wall -O
(;当然,要改进代码,直到没有警告为止。
你可能会(如果算法合适的话(尝试(有用地(分配内存区域,例如二次幂,或者二次幂的3倍[可能减去2或3个单词];至少要尽量避免太多不同随机大小的分配。
您可能想尝试使用Boehm的保守垃圾收集器,即用GC_MALLOC
替换所有malloc
(或用GC_STRDUP
替换GC_MALLOC_ATOMIC
和strdup
(,用GC_FREE
替换free
,等等
至少出于测试目的,使用setrlimit(2(可能是通过bash-ulimit内置的。你想要RLIMIT_AS
——可能有RLIMIT_DATA
(合理地设置这些限制可以避免OOM杀手,并使你的mmap
——由malloc
调用——在内存耗尽时失败(。
您可能想要使用GCC 4.8进行编译,它接受-fsanitize=address。
您还可以实现自己的特定于应用程序的垃圾收集器(阅读该Wiki页面,它为您提供了见解和术语(;标记&紧凑算法将对抗碎片化。
另请参阅这个关于内存碎片的问题。查看"插头"工具。