【发布时间】:2010-11-03 00:18:48
【问题描述】:
当我尝试在 VS 2008 中编译程序集时,我得到了(偶尔,通常在项目工作 2-3 小时后)以下错误
Metadata file '[name].dll' could not be opened --
'Not enough storage is available to process this command.
通常要摆脱这种情况,我需要重新启动 Visual Studio
我需要在我的项目中使用的程序集足够大(> 70 Mb),这可能是那个错误的原因,我在以前的项目中从未见过这样的东西。好的,如果这就是我的问题的原因是为什么会发生这种情况以及我需要做些什么来阻止它。
我的驱动器上有足够的可用内存和 2Gb RAM(发生异常时仅使用 ~1.2Gb)
我在谷歌上搜索了此类问题的答案。
建议通常与:
- 限制在 WinXP 中的用户处理程序的数量...
- 达到每个进程可用内存的物理限制
我认为两者都无法解释我的情况
对于用户处理程序和其他 GUI 资源 - 我不认为这可能是一个问题。 70Mb 的大程序集实际上是一个无 GUI 的代码,它使用套接字操作并实现专有协议的解析器。在我当前的项目中,我只有 3 个 GUI 表单,GUI 控件的总数
我想我的情况更接近于这样一个事实,即在 Windows XP 中,进程地址空间受限于 2 GB 内存(并且,考虑到内存分段,我可能没有足够大的空闲段来分配内存)。
但是,在 Visual Studio 中处理项目仅 2-3 小时后,很难相信细分会如此之大。任务管理器显示 VS 消耗大约 400-500 Mb (OM + VM)。在编译期间,VS 只需要加载元数据。
好吧,那个库中有很多类和接口,但我仍然希望 1-2 Mb 足以分配编译器用来查找所有公共的 元数据类和接口(虽然这只是我的建议,但我不知道CLR 在加载程序集元数据时到底发生了什么)。
此外,我会说整个程序集的大小之所以如此之大,仅仅是因为它是 C++ CLI 库,它具有其他 um 管理的库静态链接到一个 DLL 中。我估计(使用 Reflector).NET(托管)代码约占该程序集的 5-10%。
任何想法如何定义该错误的真正原因? .NET 程序集大小是否有任何限制或建议? (是的,我知道值得考虑重构一个大组件并将其拆分为几个较小的部分,但它是第 3 方组件,我无法重建它)
【问题讨论】:
-
我还可以补充一点,当我使用该项目时,我会不时在 Visual Studio 中遇到 OutOfMemory 异常。通常当我在设计视图中打开表单时会发生这种情况。
-
我想我在 ServerFault 上发起的这个讨论对阅读这个讨论的人也很有用serverfault.com/questions/27352/…
-
当然这个老问题只与 32 位 Windows 相关,与 64 位无关
-
在我的例子中,它是由批处理脚本引起的,在具有 16 GB RAM 和多个运行“devenv.exe”实例的机器上运行 32 位 IIS Express 7.5。解决方案 1 是关闭所有其他可能的应用程序(包括 devenv.exe),解决方案 2 是使用 64 位 IIS Express 8。这两个解决方案独立工作,当然也可以一起工作。
标签: c# visual-studio visual-studio-2008 memory-leaks metadata