Memory 64位操作系统中的32位应用程序因内存消耗较高而崩溃

Memory 64位操作系统中的32位应用程序因内存消耗较高而崩溃,memory,memory-management,64-bit,wow64,Memory,Memory Management,64 Bit,Wow64,我有一个32位版本的.net应用程序,运行在两台不同的机器上。 一个是32位机器,另一个是64位机器 在64位环境中,32位应用程序在WoW64环境中运行 64位机器配置为4GB RAM 但是,具有相同工作流的同一应用程序在32位操作系统中消耗了500MB的内存,而在64位操作系统中消耗了超过1GB的内存并导致崩溃 我阅读了以下与此相关的文章 但他们的分析并不确定。你们当中有人面对过这个问题吗?对于在64位环境中运行的32位应用程序,有什么建议吗?64位模式的区别是: 64位调用堆栈而不是

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

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

64位机器配置为4GB RAM

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

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


但他们的分析并不确定。你们当中有人面对过这个问题吗?对于在64位环境中运行的32位应用程序,有什么建议吗?

64位模式的区别是:

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

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

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

不太可能仅在调用堆栈中使用500 MB。堆栈通常保留1MB,但仅提交64KB

数据类型可能是一个问题,尤其是当您有一个为AnyCPU编译的.NET应用程序时。您确定编译的是纯32位应用程序吗

DLL可以带来巨大的不同。特别是一些SQL DLL的大小为130 MB,因此加载64位版本会产生巨大的差异。它仍然不能解释内存使用率翻倍的原因,而且只适用于任何CPU.NET应用程序


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

首先为什么要占用这么多内存?您需要创建大量内核级数据结构,以获得两者之间500 MB的差异。我无法想象这怎么可能…@nneonneo:这是一个与频繁的SQL访问捆绑在一起的.Net应用程序。该工作流非常复杂,有数千个SQL调用,因此在32位环境中消耗了500MB。除非您正在推送一些非常大的数据集,否则1000个连续SQL调用应该不会有多大影响。你查过项目参考资料了吗?试着对当前引用中的每一个进行伪调用,创建一个空白项目,看看内存使用情况是否疯狂。@nneonneo:这不是因为它消耗了更多内存。我在这里担心的是,为什么64位操作系统和32位操作系统的内存使用率有很大差异