Process Explorer 报告的 Virtual Size 是否会导致 OutOfMemory 异常?
Is it conceivable that the Virtual Size reported by Process Explorer could cause OutOfMemory exceptions?
我正在努力诊断我们应用程序中的一系列 OutOfMemoryException
问题。这是一个内部 32 位 (x86) OWIN 托管的 WebAPI,它在控制台应用程序中运行并与一系列硬件组件并行对话。出于这个原因,它创建了大约 20 个库实例,并且 "virtual size" 内存的急剧增加与创建这些实例时匹配。
从 Process Explorer 和 dotMemory 的输出来看,我们似乎并未在此应用程序中分配那么多 实际 内存:
通过阅读很多很多 SO 答案,我想我明白我们的问题要么来自 G0、G1、G2 和 LOH 堆中的碎片,要么我们可能会遇到 32- 的 2GB 可寻址内存限制bit process 运行 on Windows 7. 此应用程序分批工作,它从硬件设备收集大量数据,在内存中创建集合以将该数据聚合到单个对象中,然后将其保存到由客户端应用程序检索。 activity 是 dotMemory 视觉对象中尖峰的原因,但这些数据结构并不庞大,我认为 dotMemory 图表显示了这一点。
查看堆表明它们的大小很少超过 10-15MB,而且我没有看到太多证据表明 LOH 变得太大或严重碎片化。我真的在为如何继续更好地理解这里发生的事情而苦苦挣扎。
所以我的问题有两个:
是否可以想象我们可能会达到 2GB 的虚拟内存限制,这就是这些内存异常的原因?
如果 是 一个可能的原因,那么我认为 64 位构建可以解决这个问题是否正确?
我们正在探索迁移到 64 位版本,但这需要更新我们使用的一些低级库也是 64 位的。这当然是我们最终会探索的一个选项(如果不是更早的话),但我们正试图在投入所需时间之前更好地了解这种情况。
设置 LARGEADDRESSFLAG 后更新
根据建议,我在二进制文件上设置了该标志,有趣的是,虚拟大小立即跳到了近 3GB。我不知道我是否应该为此感到震惊?!
我将在接下来的几个小时内使用此配置监视应用程序。
在我的例子中,@ThomasWeller 提供的建议确实是正确的,启用 "large address aware" 标志允许此应用程序 运行 几天而不会抛出内存异常。
我正在努力诊断我们应用程序中的一系列 OutOfMemoryException
问题。这是一个内部 32 位 (x86) OWIN 托管的 WebAPI,它在控制台应用程序中运行并与一系列硬件组件并行对话。出于这个原因,它创建了大约 20 个库实例,并且 "virtual size" 内存的急剧增加与创建这些实例时匹配。
从 Process Explorer 和 dotMemory 的输出来看,我们似乎并未在此应用程序中分配那么多 实际 内存:
通过阅读很多很多 SO 答案,我想我明白我们的问题要么来自 G0、G1、G2 和 LOH 堆中的碎片,要么我们可能会遇到 32- 的 2GB 可寻址内存限制bit process 运行 on Windows 7. 此应用程序分批工作,它从硬件设备收集大量数据,在内存中创建集合以将该数据聚合到单个对象中,然后将其保存到由客户端应用程序检索。 activity 是 dotMemory 视觉对象中尖峰的原因,但这些数据结构并不庞大,我认为 dotMemory 图表显示了这一点。
查看堆表明它们的大小很少超过 10-15MB,而且我没有看到太多证据表明 LOH 变得太大或严重碎片化。我真的在为如何继续更好地理解这里发生的事情而苦苦挣扎。
所以我的问题有两个:
是否可以想象我们可能会达到 2GB 的虚拟内存限制,这就是这些内存异常的原因?
如果 是 一个可能的原因,那么我认为 64 位构建可以解决这个问题是否正确?
我们正在探索迁移到 64 位版本,但这需要更新我们使用的一些低级库也是 64 位的。这当然是我们最终会探索的一个选项(如果不是更早的话),但我们正试图在投入所需时间之前更好地了解这种情况。
设置 LARGEADDRESSFLAG 后更新
根据建议,我在二进制文件上设置了该标志,有趣的是,虚拟大小立即跳到了近 3GB。我不知道我是否应该为此感到震惊?!
我将在接下来的几个小时内使用此配置监视应用程序。
在我的例子中,@ThomasWeller 提供的建议确实是正确的,启用 "large address aware" 标志允许此应用程序 运行 几天而不会抛出内存异常。