0

我有一个 32 位版本的 .net 应用程序在两台不同的机器上运行。一个是 32 位机器,另一个是 64 位机器。

在 64 位环境中,32 位应用程序在 WoW64 环境中运行。

64 位机器配置为 4GB RAM。

但是具有相同工作流程的相同应用程序在 32 位操作系统中消耗 500MB,而在 64 位操作系统中消耗超过 1GB 并崩溃。

我阅读了以下与此相关的文章。

http://blogs.sepago.de/helge/2008/03/11/windows-x64-all-the-same-yet-very-different-part-5

http://blogs.citrix.com/2011/10/13/wow64-memory-mapping-of-32bit-apps-running-on-a-64bit-windows/

但他们的分析不是确定性的。你们中有人遇到过这个问题吗?是否有任何建议让 32 位应用程序在 64 位环境中运行?

4

1 回答 1

1

64位模式的区别是:

  • 64 位调用堆栈而不是 32 位调用堆栈。另外还有 WOW64 调用堆栈

  • 使用 64 位数据类型而不是 32 位数据类型

  • 加载 64 位 DLL 而不是 32 位 DLL

500 MB 仅在调用堆栈中是不可能的。堆栈通常保留 1 MB,但仅提交 64 kB。

数据类型可能是个问题,特别是如果您有一个为 AnyCPU 编译的 .NET 应用程序。您确定您编译的是纯 32 位应用程序吗?

DLL 可以产生巨大的影响。尤其是一些 SQL DLL 的大小为 130 MB,因此加载 64 位版本会产生巨大的差异。它仍然没有解释双倍的内存使用,并且仅适用于 AnyCPU .NET 应用程序。

下一个问题是:为什么应用程序在 64 位操作系统上已经崩溃了 1 GB 而不是接近 2 GB(32 位)或 4 GB(AnyCPU)?你确定你测量的东西是正确的吗?也许您只测量了私有字节,甚至测量了工作集大小,这在这里都没有真正的帮助。

于 2013-09-17T21:42:52.160 回答