Linux中C应用程序的内存稳定性

前端之家收集整理的这篇文章主要介绍了Linux中C应用程序的内存稳定性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我想验证我为Linux编写和编译的C应用程序的内存稳定性.
它是一个网络应用程序,以每秒10-20个连接的速率响应远程客户端连接.
从长远来看,内存增加到50MB,尽管应用程序正在调用删除

调查显示Linux没有立即释放内存.所以这是我的问题:

如何强制Linux释放我实际释放的内存?至少我想这样做一次以验证内存稳定性.
否则,是否有可靠的内存指示器可以报告我的应用实际持有的内存?

最佳答案
你所看到的很可能根本不是内存泄漏.如今,操作系统和malloc / new堆都会对内存进行非常复杂的记忆.总的来说,这是一件非常好的事情.您可能会尝试强制操作系统释放内存,这只会损害您的应用程序性能和整体系统性能.

为了显示

> Heap保留了几个虚拟内存区域供使用.在malloc之前,它们都没有实际提交(由物理内存支持).
>你分配内存.堆相应增长.你在任务管理器中看到了这个.
>您在堆上分配更多内存.它变得更多.
>释放在步骤2中分配的内存.但是,Heap不能缩小,因为#3中的内存仍然被分配,而Heap无法压缩内存(它会使指针无效).
>你malloc /新的东西.这可能会在步骤#3中分配的内存之后加入,因为它无法适应free’ing#2所打开的区域,或者因为堆栈管理器为剩下的块打开堆而没有效率# 2. (取决于Heap实现和分配/释放的内存块大小)

那么第二步的记忆现在已经死了吗?不必要.首先,一旦它变得高效,它最终可能会被重复使用.在不重用的情况下,操作系统本身可以使用cpu的虚拟内存功能(TLB)从应用程序下面“重新映射”未使用的内存,并将其分配给另一个应用程序 – 在苍蝇Heap意识到了这一点,并且通常以某种方式管理事物,以帮助提高操作系统重新映射页面的能力.

这些都是宝贵的内存管理技术,具有通过Process Explorer呈现细粒度内存泄漏检测的无限副作用,大多无用.如果要检测堆中的小内存泄漏,则需要使用运行时堆泄漏检测工具.既然你提到你也可以在Windows上构建,我会注意到微软的CRT内置了足够的泄漏检查工具.使用说明见:

http://msdn.microsoft.com/en-us/library/974tc9t1(v=vs.100).aspx

malloc的开源替代品可用于GCC/C++lang工具链,但我没有直接经验.我认为在Linux上,Valgrind无论如何都是首选且更可靠的泄漏检测方法. (根据我的经验,比MSVCRT Debug更容易使用).

猜你在找的Linux相关文章