我的一个应用程序中遇到了大量内存泄漏:每当泄漏发生时,我的计算机都会非常慢。在我修复泄漏之前,我想了解为什么会发生这种情况。
例如,以下带有泄漏的小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);
根据我对虚拟内存,磁盘缓存等的理解,我希望当上面的代码在最后一行等待用户输入时,它的1千兆字节缓冲区不再被使用,所以操作系统应该逐渐将它交换到磁盘并“忘记”它。我(用户)会在一段时间内减速,但事情会在一段时间后恢复正常。
这不是我的系统上发生的事情(Windows XP,32位,2 GB RAM)。当我运行上面的代码(两次,在2个独立的cmd
窗口中,为了浪费所有可用的内存),我觉得我的系统速度很慢;它会在几分钟后变好,但不会达到最佳性能。终止泄漏的“应用程序”后,系统恢复正常。
为了显示一些数字,我使用了一些源代码的编译作为性能测试。我连续几次编译它以进行多次测量(以秒为单位)。
3倍的放缓,我预计没有。怎么解释这个?
答案 0 :(得分:1)
Windows交换文件的大小有限。如果你用1GB的缓冲区填充大部分内容,那么系统必须更加努力地工作,将剩余的内存交换进去。