【问题标题】:32 bit process memory leak on x64 processorx64 处理器上的 32 位进程内存泄漏
【发布时间】:2016-07-19 10:13:16
【问题描述】:

我制作了一个始终在 x64 机器上运行的 32 位 c++ 程序。一个客户说运行这个进程的 5 个实例正在使用导致他们所有的 24 GB RAM 都被使用。

我立即认为存在内存泄漏,但我无法重现此内存问题。

我发现Memory Limits for Windows 对内存分配进行了更多研究。这告诉我操作系统不允许 32 位进程使用超过 2 GB 的内存。

在 64 位窗口上的 32 位应用程序是否有可能使用超过 2 GB 的内存泄漏?

附:终止进程会导致内存恢复到正常运行级别(大约 2 GB)。

[编辑] 我现在看到大部分正在使用的内存是内核内存:非分页。这是否意味着它正在使用某些系统资源而不是内存泄漏?

[更新] 问题不是驱动程序或内存泄漏。这似乎是一个进程句柄泄漏。有一些东西不断地为文件启动新的句柄。这是使用 perfmon 监视进程时发现的。根据经验,如果一个进程有超过 2000 到 3000 个句柄,您应该进行调查。特别是如果这个数字每隔几秒就增加一次。

【问题讨论】:

  • 您不能安装 Windows 64 位并使用他们的数据集重新测试或检索转储和分析吗?这将为您省去很多麻烦...
  • 我也在使用 Windows 64。我查看了崩溃时的进程转储。它告诉我它试图访问一个内存位置但它不能。我怀疑它只是内存不足,当我尝试分配一些内存时它崩溃了。
  • 是的,池内存 = 驱动程序。使用 poolmon/xperf/WPA 分析池内存使用情况:superuser.com/a/674725 以查看是哪个驱动程序导致的
  • 消耗 24GB 的非分页池是不可能的。您没有收集正确的统计数据。让一个 32 位进程占用许多 GB 的 RAM 并不是很困难,只需以非常高的速率写入文件即可。确定为进程分配多少 RAM 以及为文件系统缓存分配多少内存是操作系统的职责。它从不故意避免使用 RAM。
  • 所以我发现了问题。一个进程绑定到一个固定端口。当下一个进程打开时,它会每隔 500 毫秒尝试绑定到同一个端口。该线程每次尝试都会创建一个新句柄。线程句柄泄漏被存储在非分页池内存中。在 16 GB ram pc 上,这填满了所有内存,我的进程没有任何东西可以使用,这导致它崩溃。添加了绑定尝试限制来解决问题。

标签: c++ memory memory-management memory-leaks 32bit-64bit


【解决方案1】:

Memory Limits for Windows 中所述,64 位系统上的 32 位进程限制为 4 GB,并设置了 IMAGE_FILE_LARGE_ADDRESS_AWARE,因此您的 5 个进程总共可能消耗 20 GB 内存。这可以通过LARGEADDRESSAWARE选项设置,扩展虚拟地址空间。

【讨论】:

    【解决方案2】:

    这显然是可能的,因为客户正在经历它。

    (也许您确实希望有一些想法?您没有提供太多信息或代码,因此我建议以非常笼统的方式分配内存可能不在应用程序本身中。也许应用程序本身会占用只有~1-2GiB,但也会让操作系统做一些愚蠢的事情,比如4 + GiB大小的文件的虚拟内存映射,或其他设备锁定,设备驱动程序会做一些愚蠢的事情,等等......)

    您应该分析目标系统上的内存使用情况,以了解 您的 代码确实使用了多少。然后你可以尝试搜索它的其余部分。

    【讨论】:

    • 我们查看了任务管理器提交和工作集大小,它从未超过 550 MB。我不确定这是否是您对内存进行分析的意思,但如果您能详细说明这一点,我将不胜感激。
    【解决方案3】:

    一般来说,使用/LARGEADDRESSAWARE:ON 链接器开关可以允许32 位应用程序使用超过2GB。同样使用Address Windowing Extensions 可以允许使用更多内存。但是,如果您没有在应用程序中使用任何这些技术,那么它应该具有 2GB 范围。但是,由于上限 2GB 范围用于系统资源,您是否正在泄漏系统资源?

    【讨论】:

    • 我没有启用 /LARGEADDRESSAWARE。您能否详细说明我是如何泄漏系统资源的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 2018-12-18
    • 2010-11-06
    • 2017-08-11
    • 1970-01-01
    相关资源
    最近更新 更多