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

标签 c++ linux memory memory-leaks

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

调查显示 Linux 不会立即释放内存。所以这是我的问题:

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

最佳答案

您所看到的很可能根本不是内存泄漏。如今,操作系统和 malloc/new heaps 都对内存进行了非常复杂的计算。总的来说,这是一件非常好的事情。您强制操作系统释放内存的任何尝试都可能只会损害您的应用程序性能和整体系统性能。

举例说明:

  1. 堆保留了几个虚拟内存区域供使用。在 malloc 之前,它们都没有实际提交(由物理内存支持)。

  2. 你分配内存。堆相应地增长。您会在任务管理器中看到它。

  3. 您在堆上分配了更多内存。它长得更多。

  4. 您释放了在步骤 2 中分配的内存。但是,堆无法缩小,因为 #3 中的内存仍在分配,并且堆无法压缩内存(这会使您的指针无效)。

  5. 你 malloc/new 更多东西。这可能会在第 3 步分配的内存之后被添加,因为它无法容纳在第 2 步释放后留下的区域,或者因为堆管理器搜索堆的效率很低对于 #2 留下的 block 。 (取决于堆实现和正在分配/释放的内存块大小)

那么第 2 步的内存现在对世界来说已经死了吗?不必要。一方面,一旦它变得有效,它最终可能会被重用。在不重用的情况下,操作系统本身可以使用 CPU 的虚拟内存功能(TLB)从您的应用程序中“重新映射”未使用的内存,并将其分配给另一个应用程序——在苍蝇。堆意识到了这一点,并且通常以一种有助于提高操作系统重新映射页面的能力的方式进行管理。

这些都是有值(value)的内存管理技术,它们具有通过 Process Explorer 进行细粒度内存泄漏检测的未减轻的副作用,但几乎毫无用处。如果您想检测堆中的小内存泄漏,那么您需要使用运行时堆泄漏检测工具。由于您提到您也可以在 Windows 上构建,我会注意到 Microsoft 的 CRT 具有足够的内置泄漏检查工具。此处使用说明:

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

虽然我没有直接使用它们的经验,但也有可用于 GCC/Clang 工具链的 malloc 的开源替代品。我认为在 Linux 上 Valgrind 是首选且更可靠的泄漏检测方法。 (根据我的经验,比 MSVCRT 调试更容易使用)。

关于c++ - Linux 中 C++ 应用程序的内存稳定性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14023815/

相关文章:

c++ - C++ 中的 Typedef 函数指针

c++ - 方法调用的链接

php - linux , 只允许用户执行一个带有可变变量的命令

linux - Compiz-Snow插件

java - java中的内存使用大数组难题

c++ - 将字符串文字返回到 C++ 中的 const String 引用

python脚本检测热插拔事件

java - 为 Java 应用程序设置 MaxDirectMemory 和 MaxHeapMemory

javascript - 清除浏览器中的内存

c++ - floor 在不同的平台上给出不同的结果