在我的一个应用程序中,我一直遭受大量内存泄漏的困扰:只要发生泄漏,我的计算机就会变得非常慢。在我修复泄漏之前,我想了解为什么会发生这种情况。
例如,以下带有泄漏的小 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 倍,我预计不会。这怎么解释?