2009-11-26 101 views
1

进入开发工具(模拟器工具)不断抛出OutofMemoryException的问题,我知道它不是我的应用程序,因为无论运行什么项目,都会发生。清除CLR内存

我到目前为止唯一的解决方法是重新启动我的电脑,是否有办法刷新/清除CLR运行时,所以我不必每次都重新启动我的电脑?

+0

林在我束手无策这里...我必须弄清楚到底是怎么发生的事情,我无法承受不断重新启动我的电脑 – Mark 2009-11-26 02:50:06

+0

我可以以某种方式增加我的CLR内存? – Mark 2009-11-26 03:25:28

回答

0

OutOfMemoryException并不一定表示运行时有问题。任何时候系统耗尽内存,无论消耗什么,都可能发生。

看看任务管理器中的进程列表,看看哪些内存消耗最多。

+0

我看到了,看着我的任务管理器,我只用了1.68GB的内存,而PC有4GB可用。所以我不认为它的物理资源多数民众赞成在问题 – Mark 2009-11-26 02:20:02

+0

好的。这可能是GC堆碎片化了。您可以尝试在SOS调试扩展中使用DumpHeap命令(http://msdn.microsoft.com/zh-cn/library/bb190764%28VS.80%29.aspx)。如果您看到很大比例的“空闲”插槽,则会出现碎片。 – 2009-11-26 02:51:10

+0

如果我这样做? – Mark 2009-11-26 03:00:05

1

每个运行托管代码的进程都会启动一个单独的CLR运行时副本 - 并且当任何类型的进程终止时,它所消耗的内存将被回收到通用池中。

没有什么共享“冲洗”或“清除”。

有没有可能您的模拟器工具没有“一路崩溃” - 该过程在故障状态中四处徘徊?

+0

可能,但我看不到任何目前看起来可疑的进程。我真的不知道:( – Mark 2009-11-26 02:59:34

1

听起来像这是第三方工具。所以我会向他们提交一个bug请求。

但正如其他人所说,问题将包含在操作系统进程中。使用任务管理器,您应该能够识别违规流程并杀死它。这将回收内存并擦干净。您将不得不重新开始仿真。

如果这个问题阻止你完成你的模拟,那么我会提交一个紧急的(但不是生气的)错误请求。

+0

多数民众赞成在这个事情,我没有看到任何正在占用那么多内存的任务,但不要担心我会提出一个错误修复!:) – Mark 2009-11-26 03:18:14

+0

OoME可能是由以外的事情引起的而不是使用很多的记忆。我曾经有过OoME,因为我忘记处理Bitmap对象,所以我耗尽了GDI句柄的供应。 – ligos 2009-11-30 02:32:05

0

Windows上的x86/32位用户模式进程仅具有2GB的可寻址虚拟内存空间。一个x64/64位进程具有16TB的可寻址虚拟内存。你没有说你的进程是32位还是64位 - 但我会假设32位。一旦32位进程开始冒险进入虚拟或承诺内存的1.5+ GB区域,则您正在玩火,在应用程序崩溃之前,这只是一个时间问题。由于每个应用程序都不同,因此它会在崩溃时崩溃。

那么让我们来谈谈可寻址空间的“2GB”......您的应用程序使用的内存无法访问所有2GB内存。还有就是额外消耗大量片的CLR需要运行的应用程序:

  1. 的.NET应用程序的8层不同的堆 - 看到我的回答.NET process memory usage = 5x CLR Heap Memory?
  2. 内核开销运行的用户模式进程
  3. 线程

所以,你可以拥有的内存演出系统上可用,但应用程序可以很容易崩溃,如果它是x86和接近上述限制。

我已经在StackOverflow上发布了很多有关CLR内存的答案和信息,这些内容描述了很多工作原理。寻找我的名字并查看一些其他答案。这可能有助于清理一些事情。

HTH