没有足够的存储空间可用于在VisualStudio 2008中处理此命令

Bog*_*_Ch 35 c# memory-leaks metadata visual-studio-2008 visual-studio

当我尝试在VS 2008中编译程序集时,我得到(偶尔,通常在项目工作2-3小时后)以下错误

Metadata file '[name].dll' could not be opened -- 
       'Not enough storage is available to process this command.
Run Code Online (Sandbox Code Playgroud)

通常要摆脱我需要重新启动Visual Studio

我需要在我的项目中使用的程序集足够大(> 70 Mb),可能这就是这个bug的原因,我以前的项目中从未见过这样的事情.好吧,如果这就是我的问题是为什么会发生这种情况以及我需要做些什么来阻止它的原因.

我的驱动器和2Gb RAM上有足够的可用内存(异常发生时仅使用~1.2 Gb)

我用谷歌搜索了这样的问题的答案.

建议通常涉及:

  1. 到WinXP中限制的用户处理程序数量...
  2. 到每个进程可用的内存物理限制

我认为不能解释我的情况

对于用户处理程序和其他GUI资源 - 我不认为这可能是一个问题.大型70Mb程序集实际上是一个无GUI的代码,可以使用套接字操作并实现专有协议的解析器.在我目前的项目中,我只有3个GUI表单,GUI控件总数<100.

我想我的情况更接近于这样一个事实:在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程序集大小是否有任何限制或建议?(是的,我知道值得考虑重构和将大型组件拆分成几个较小的组件,但它是第三方组件,我无法重建它)

Ant*_*nes 19

该错误具有误导性.它确实应该说"无法找到虚拟内存中足够大的连续空间来执行操作".随着时间的推移,虚拟内存空间的分配和释放会导致它变得支离破碎.这可能导致尽管有足够的总空间可用但无法填充大量分配的情况.

我认为这是你的"细分"所指的.如果不知道其他所有需要加载的细节以及其他占用2-3小时的活动,很难说这是否真的是原因.但是我不会把它放到不太可能的类别中,事实上它是最可能的原因.


Jar*_*Par 10

正如安东尼指出的那样,错误信息有点误导.问题不在于你的程序集有多大,而是关于可用内存的连续性.

问题可能不是你装配的大小.Visual Studio内部的某些内容更可能是将内存分段到构建无法完成的程度.这类问题的常见嫌疑人是

  1. 解决方案中的项目太多.
  2. 第三方加载项

如果您在解决方案中有超过10个项目.尝试分解解决方案,看看是否有帮助.

如果您有任何第三方插件,请尝试一次禁用一个,并查看问题是否消失.