我有C Linux应用程序,它使用malloc,calloc,realloc和amp;来连续分配和释放内存(每秒大约200个alloc / free)。免费功能。即使释放了所有分配的内存(通过包装* alloc和free验证),VmSize,VmRSS& VmData数字不断增加,最终应用程序被OOM杀手杀死。
为什么VmSize,VmRSS& VmData继续增加?如果是内存管理问题,有什么指针可以避免这种情况吗?
我看到了这个Problem usage memory in C,但答案并没有解释OOM的行为。
答案 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
),您的free
与GC_FREE
等...
至少出于测试目的,可能通过bash setrlimit(2)内置使用ulimit。您希望RLIMIT_AS
- 可能与RLIMIT_DATA
(设置这些限制明智地避免OOM杀手并使mmap
- 由malloc
调用 - 在内存耗尽时失败。)
您可能希望使用接受-fsanitize=address的GCC 4.8进行编译。
您还可以实施自己的应用程序garbage collector(阅读wikipage,它会为您提供见解和术语); mark & compact algorithm将对抗碎片化。