我有一个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位环境中运行?
答案 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)?你确定你已经测量了正确的东西吗?也许你只测量了私有字节,甚至是工作集大小,这在这里都没有用。