我制作了一个始终在 x64 机器上运行的 32 位 c++ 程序。一个客户说运行这个进程的 5 个实例正在使用导致他们所有的 24 GB RAM 被使用。
我会立即认为存在内存泄漏,但我无法重现此内存问题。
对我发现的内存分配进行更多研究 Memory Limits for Windows .这告诉我操作系统不允许 32 位进程超过 2 GB 的内存。
64 位 Windows 上的 32 位应用程序是否有可能使用超过 2 GB 的内存泄漏?
附言终止进程会使内存恢复到正常运行水平(大约 2 GB)。
[编辑] 我现在看到大部分正在使用的内存是内核内存:非分页。这是否意味着正在使用某些系统资源而不是内存泄漏?
[更新] 问题不是驱动程序或内存泄漏。这似乎是进程句柄泄漏。有些东西不断地开始新的文件句柄。这是使用 perfmon 监控进程时发现的。根据经验,如果一个进程有超过 2000 到 3000 个句柄,您应该进行调查。特别是如果这个数字每隔几秒就增加一次。
最佳答案
如 Memory Limits for Windows 中所述,在设置了 IMAGE_FILE_LARGE_ADDRESS_AWARE 的情况下,64 位系统上 32 位进程的限制为 4 GB,因此您的 5 个进程总共可以消耗 20 GB 的内存。这可以通过 LARGEADDRESSAWARE 设置扩展虚拟地址空间的选项。
关于c++ - x64 处理器上的 32 位进程内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38455589/