我做了一个32位的c ++程序,总是在x64机器上运行。客户端说运行此进程的5个实例正在使用它们导致所有24 GB RAM使用。
我当时认为存在内存泄漏,但我无法重现此内存问题。
对内存分配进行了更多研究,我发现Memory Limits for Windows。这告诉我操作系统不允许32位进程超过2 GB的内存。
64位窗口上的32位应用程序是否可以使用超过2 GB的内存泄漏?
P.S。杀死进程会导致内存恢复到正常操作级别(大约2 GB)。
[编辑]我现在已经看到使用的大部分内存是内核内存:非分页。这是否意味着它是一些正在使用的系统资源,而不是内存泄漏?
[更新]问题不是驱动程序或内存泄漏。这似乎是一个过程处理泄漏。有一些东西不断启动文件的新句柄。发现这是使用perfmon来监控过程。根据经验,如果一个进程有超过2000到3000个句柄你应该调查。特别是如果这个数字每隔几秒钟增加一次。
答案 0 :(得分:1)
如Memory Limits for Windows中所述,64位系统上的32位进程限制为4 GB且设置了IMAGE_FILE_LARGE_ADDRESS_AWARE,因此您的5个进程可能会消耗20 GB的内存总量。这可以通过LARGEADDRESSAWARE选项进行设置,该选项可以扩展虚拟地址空间。
答案 1 :(得分:0)
显然有可能,因为客户正在体验它。
(也许你确实想到了一些想法?你没有提供太多的信息或代码,所以我会建议内存分配可能不是直接在应用程序本身。也许应用程序本身只需要1-2GiB,但也会激活操作系统做一些愚蠢的事情,比如大小为4 + GiB的文件的虚拟内存映射,或者其他设备锁定,设备驱动程序做些蠢事等等......)
您应该在目标系统上分析内存使用情况,以了解您的代码使用了多少。然后你可以尝试搜索剩下的部分。
答案 2 :(得分:0)
通常,使用/LARGEADDRESSAWARE:ON链接器开关可以允许32位应用程序使用超过2GB。同样使用Address Windowing Extensions可以允许使用更多内存。但是,如果您在应用程序中没有使用这些技术,那么它应该具有2GB范围。但是,由于上限2GB范围用于系统资源,您可能是在泄漏系统资源吗?