繁体   English   中英

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

[英]Linux c application memory usage

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

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

在C中看到了此问题用法内存 ,但答案并未解释OOM行为。

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

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

您可能需要使用尝试贝姆保守的垃圾收集器 -即替换所有mallocGC_MALLOC (或GC_MALLOC_ATOMICstrdupGC_STRDUP ),你的freeGC_FREE ,等...

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

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

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

另请参阅有关内存碎片的问题 查看“ 插入”工具。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM