【发布时间】:2011-03-30 04:54:24
【问题描述】:
在我的一个应用程序中,我一直遭受大量内存泄漏的困扰:只要发生泄漏,我的计算机就会变得非常慢。在我修复泄漏之前,我想了解为什么会发生这种情况。
以下面有泄漏的小 C++ 代码为例:
size_t size = 1024 * 1024 * 1024;
char* buf = new char[size];
std::fill_n(buf, size, 'o');
std::string pause;
std::getline(std::cin, pause);
根据我对虚拟内存、磁盘缓存等的理解,我希望上面的代码在最后一行等待用户输入时,它的 1GB 缓冲区不再被使用,因此操作系统应该逐渐将其交换到磁盘并“忘记”它。我(用户)会遭受一段时间的减速,但过一段时间就会恢复正常。
这不是在我的系统(Windows XP,32 位,2 GB 内存)上发生的。当我运行上述代码时(两次,在 2 个单独的 cmd 窗口中,为了浪费所有可用内存),我觉得我的系统速度非常慢;几分钟后它会变得更好,但没有接近最大性能。在我终止泄漏的“应用程序”后系统恢复正常。
只是为了显示一些数字,我使用了一些源代码的编译作为性能测试。我连续编译了几次以进行多次测量(以秒为单位)。
- 泄漏前:14、2、2、3、2、...
- 泄漏后:183、40、9、7、9、...
- 关闭泄漏的“应用程序”后:12、2、2、...
我预计不会出现 3 倍的减速。这怎么解释?
【问题讨论】:
-
查看系统的性能指标 -- 有多少来自应用程序的数据真正处于交换状态?
-
愚蠢的问题,但您是通过发布版本还是调试版本测试性能?
-
@Dialectus 调试;为什么重要?
-
Debug 构建中发生了很多事情,这使得性能测试不可行。在发布中进行测试。除其他事项外,调试中的 CRT 将用 0xCD 字节填充新创建的缓冲区。在这里查看答案stackoverflow.com/questions/370195/…
标签: windows memory-leaks virtual-memory