【问题标题】:Memory leaks and sluggish user experience内存泄漏和缓慢的用户体验
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 我将交换文件的大小从 1 GB 增加到 3 GB;没有帮助。
  • 从 1GB 到 3GB?伙计们,伙计,这太小了。在一台 3GB RAM 的机器上,我的是 8GB。
猜你喜欢
  • 2013-08-23
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 2022-08-05
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多