1

在我的一个应用程序中,我一直遭受大量内存泄漏的困扰:只要发生泄漏,我的计算机就会变得非常慢。在我修复泄漏之前,我想了解为什么会发生这种情况。

例如,以下带有泄漏的小 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 RAM)上发生的情况。当我运行上述代码时(两次,在 2 个单独的cmd窗口中,为了浪费所有可用内存),我觉得我的系统速度非常慢;几分钟后它会变得更好,但没有接近最大性能。在我终止泄漏的“应用程序”后,系统恢复正常。

只是为了显示一些数字,我使用一些源代码的编译作为性能测试。我连续编译了几次以进行多次测量(以秒为单位)。

  • 泄漏前:14、2、2、3、2、...
  • 泄漏后:183、40、9、7、9、...
  • 关闭泄漏的“应用程序”后:12、2、2、...

减速 3 倍,我预计不会。这怎么解释?

4

1 回答 1

1

Windows 交换文件的大小是有限的。如果你用 1GB 缓冲区填满了大部分内存,那么系统必须更加努力地工作,将剩余的内存换入和换出剩余的内存。

于 2011-03-29T20:54:24.370 回答