【问题标题】:Clear the CLR memory清除 CLR 内存
【发布时间】:2010-12-20 13:01:24
【问题描述】:

我遇到了一个问题,我用于开发的工具(模拟器工具)不断抛出 OutofMemoryException,我知道它不是我的应用程序,因为无论我运行什么项目,它都会发生。

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

【问题讨论】:

  • 我的智慧到此为止......我必须弄清楚到底发生了什么,我不能继续重启我的电脑
  • 我可以增加我的 CLR 内存吗?

标签: memory clr


【解决方案1】:

这听起来像是一个 3rd 方工具。所以我会向他们提交错误请求。

但正如其他人所说,该问题将包含在操作系统进程中。使用任务管理器,您应该能够识别有问题的进程并将其杀死。这将回收内存并将石板擦干净。然后你必须重新开始你的模拟。

如果这个问题阻止您完成模拟,那么我会提出紧急(但不是愤怒)错误请求。

【讨论】:

  • 就是这样,我没有看到任何占用这么多内存的任务。但别担心我会提出一个错误修复! :)
  • OoME 可能是由于使用大量内存以外的其他原因造成的。我曾经因为忘记处理 Bitmap 对象而得到了一个 OoME,我用尽了 GDI 句柄的供应。
【解决方案2】:

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

没有什么可以共享“刷新”或“清除”。

您的模拟器工具是否有可能没有“一直”崩溃 - 进程一直处于故障状态?

【讨论】:

  • 可能,但我目前看不到任何可疑的进程。我真的不知道:(
【解决方案3】:

OutOfMemoryExceptions 不一定表示运行时存在问题。每当您的系统内存不足时,无论是什么消耗它,都可能发生这种情况。

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

【讨论】:

  • 我明白了,看看我的任务管理器,我只使用了 1.68GB 内存,而 PC 有 4GB 可用。所以我不认为它的物理资源是问题
  • 好的。可能是 GC 堆碎片化了。您可以尝试在 SOS 调试扩展 (msdn.microsoft.com/en-us/library/bb190764%28VS.80%29.aspx) 中使用 DumpHeap 命令。如果您看到很大比例的“免费”插槽,则说明存在碎片。
  • 您必须找出导致碎片的原因并修复它。这绝不是一件容易的事。这里有一篇文章非常详细地解释它:informit.com/articles/article.aspx?p=1409801&seqNum=1很抱歉我没有一个简单的答案给你。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-13
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    相关资源
    最近更新 更多