【问题标题】:System out of memory exception on 64bit machine?64位机器上的系统内存不足异常?
【发布时间】:2012-07-15 14:02:00
【问题描述】:

我有一个带有其他 6 个类库项目的 asp.net 应用程序。在我的一个主要类库项目中,我缓存了一些静态数据库表。 Webdev.webserver40.exe 达到约 1.5 GB,并引发“系统内存不足异常”。我知道在 32 位机器上我最多只能有 2 GB 的进程大小,但我的开发机器是 64 位,64 位不应该有限制。好的,我看到你说你的 Asp.net 应用程序无论如何都会运行 32 位,即使我有 64 位机器。因此我得到了例外。但是我能做些什么来解决这个问题呢?

  • 我打开配置管理器并尝试将所有类库更改为 x64,但我无法更改我的主网站项目。这就是为什么 32 位网站无法识别 64 个参考文献的原因。

请不要告诉我我应该做本地数据库或其他一些选项,而不是缓存到内存中:) 好的,这些也是其他选项,但首先我想知道内存中是否有任何其他选项。我什至需要有超过 2gb 的缓存。

PS,调试选项卡下的“启用 VS 托管进程”选项是什么?它会影响我的问题吗?我尝试检查和取消检查,但没有任何改变。确实看起来检查它的效果更好,但我仍然遇到异常。

编辑 1:当我发现那篇文章时,它告诉我,如果在 64 位操作系统上运行 32 位应用程序,我应该有 2800 mb max。进程大小,但为什么它不允许我这样做并在 1500mb 左右抛出异常。

http://blogs.msdn.com/b/tom/archive/2008/04/10/chat-question-memory-limits-for-32-bit-and-64-bit-processes.aspx

编辑 2:我尝试将该代码添加到我在其中进行缓存的类库的 app.config 中,以及按照msdn 的建议添加到 web.config 中,它只说框架 4.5,但我使用 4.0。 4.0 上是否有类似的 hack?因为我不确定是否应该安装并开始使用 4.5,虽然它不是最后一个版本。

<runtime>
  <gcAllowVeryLargeObjects enabled="true" />
</runtime>

感谢您的帮助。 问候。

【问题讨论】:

  • 如果您的一个或多个引用仅是 32 位的,那么您的整个站点将是 32 位的。无论您使用的是 64 位计算机,该进程仍然仅限于 32 位地址空间。该空间需要与操作系统共存,因此仍占用其标准的内存份额。
  • 您能确认您使用的是 32 位程序集引用吗?
  • @Aristos:你说的是应用程序池吗?我的意思是本地调试,所以我的问题与 IIS 无关。
  • 我的 Web 应用程序运行 32 位。我用processexplorer检查了它。但是我可以更改运行 64,因为它是 Web 应用程序而不是 Windows 应用程序吗?谢谢

标签: asp.net memory 64-bit out-of-memory


【解决方案1】:

您可以将 IIS express 设置为在 Visual Studio 中运行 64 位:

转到 Visual Studio - 工具 - 选项菜单

选择:- 项目和解决方案,然后选择 Web 项目

勾选复选框:“为网站和项目使用 64 位版本的 IIS Express”

无需修改注册表。

【讨论】:

  • 这终于是VS2015的答案了。早期版本的 VS 不允许这样做。不幸的是,如果你占用了这么多内存并且你想弄清楚是什么持有这么多内存,那么拍摄内存快照几乎是不可能的,因为在快照期间你也会出现内存不足的异常。 VS2015 企业版可以选择分析内存转储文件,这是唯一可用的选项。 Redgate 内存分析器也可以是其他选项
【解决方案2】:

我可能弄错了,但我确实相信 Webdev.webserver40.exe(又名 Cassini)是一个 32 位原生 C++ 应用程序。

在您的 asp.net Web 项目属性页面中,选中“使用 IIS Express”复选框,看看是否可以解决您的问题

编辑: 还要检查这些东西 -

  1. 检查您是否确实有足够的 RAM 来保存您的数据
  2. 确保您的交换文件驱动器上有足够的可用 HDD 空间
  3. 确定您的交换文件是动态的还是固定大小的

【讨论】:

  • 是的,我只是在考虑 iis express。我稍后会尝试并让你知道。谢谢
  • 您可能还想考虑在成熟的 IIS 中尝试它(如果 IISExpress 不起作用),因为它可能对内存情况有更好的(请原谅双关语)
  • IIS express 8 我相信只有 64 位支持,但我仍然不知道如何调试 64 位?每次调试时,我都会在任务管理器上看到我的 issexpress.exe 有 32*?有什么建议吗?谢谢
猜你喜欢
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 2013-06-24
  • 1970-01-01
相关资源
最近更新 更多