【问题标题】:What will the effect of trimming my "working set" be on a system with no page file?修剪我的“工作集”会对没有页面文件的系统产生什么影响?
【发布时间】:2011-06-21 09:40:52
【问题描述】:

一位客户抱怨我的程序使用了太多内存。然而,在与他们合作了一段时间后,我意识到:

  1. 他们已经关闭了他们的页面文件(在他们的终端服务框中)。
  2. 他们担心我的程序的任务管理器中的“私有工作集”图形的大小。

所以,我的问题是,如果我只是在我的程序启动后使用 EmptyWorkingSet() 修剪工作集的大小(它在 XML 解析期间使用大量内存,然后将其删除,但工作集没有似乎下降了)我可以使工作集数字下降。但是,这真的会帮助客户吗?我有一种感觉,这只是意味着工作集将被分页,我相信如果你关闭了页面文件,工作集无论如何都是由真实内存支持的......

说任务管理器报告为“私有工作集”真的是我的程序有多少新/分配的,这是真的吗?

【问题讨论】:

  • 他们是关闭页面文件的白痴。
  • @Andrew: ...也许他们来自 linux 背景,实际上你可以在 2GB RAM 中运行有价值的程序而无需点击交换;-p
  • 是的,我完全同意,不幸的是,管理层坚持要我修复它,而不是告诉客户打开他们的页面文件...... :-(

标签: c++ c windows memory-management


【解决方案1】:

至少在标准术语的意义上,“私有工作集”是您的程序映射的内存量,它不受磁盘或其他文件(程序可执行文件、dll 或手动内存映射文件)支持共享资源。如果启用了交换(分页),则它是您的程序在完全换出内存时所占用的交换空间量。

我同意您的管理层的意见,即您需要修复臃肿的程序。对于具有低延迟要求的客户来说,关闭交换是一个非常明智的决定。如果您的程序使用 2GB 内存,那么您可能需要重新考虑使用什么库来表示内存中的 XML 数据。

【讨论】:

  • 2Gb!还不错;-) 或者可能是这样,每个会话使用大约 100Mb,但遗憾的是他们有 100 个会话,所以 erm...10Gb!吞咽..
  • 每个会话的工作集是否可能大致相同?如果是这样,您可能会考虑将存储支持移动到数据库以便可以共享,或者只是根据需要从 xml 中解析和提取数据,而不是在 ram 中保留整个事物的表示。
【解决方案2】:

您注意到您的工作集在new/malloc 之后上升。这是因为他们要求操作系统提供内存。您还注意到它在delete/free 之后不会下降。这是因为它们不会将内存返回给操作系统。在正常、健全的系统上,这不是问题。您的进程未使用的内存空间将最终以交换、未触及和内存不足的方式结束。

在这个特殊的盒子上,您最好直接调用HeapAlloc 覆盖operator new,并调用HeapFree 覆盖operator delete。为 Server 2003 启用低碎片堆;这已经是 2008 年的默认设置了。

【讨论】:

    【解决方案3】:

    私有工作集似乎是您的程序单独使用和需要的虚拟内存,所以我不确定重置是否会对您有所帮助。我会找出为什么您的程序使用这么多内存,而不是尝试使用私有工作集。

    内存泄漏?

    【讨论】:

    • 我不确定这是否是内存泄漏,因为我的程序一旦启动就不会增长。可能我确实需要使用这么多内存,因为这个客户给了我一个非常大的配置 XML 文件,其中大部分我需要保存在内存中(如果我卸载它,内存确实会下降)。也许我需要一个分析工具来确定大部分内存的位置,以便我可以开始修剪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 2010-12-03
    • 2011-03-15
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 2021-11-27
    相关资源
    最近更新 更多