由于内存消耗较高,32位应用程序在64位操作系统中崩溃

时间:2012-09-25 06:05:49

标签: memory memory-management 64-bit wow64

我有一个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位环境中运行?

1 个答案:

答案 0 :(得分: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)?你确定你已经测量了正确的东西吗?也许你只测量了私有字节,甚至是工作集大小,这在这里都没有用。