“超出虚拟内存”的崩溃

时间:2011-11-14 13:15:55

标签: c# .net memory-management

我正在维护一个现有的应用程序,并且在某些条件下运行时遇到了一个错误(容易重现),其中应用程序失败并显示消息:

  • 标题:“Windows - 虚拟内存不足”
  • 内容:“Windows虚拟内存不足......”

问题是:我需要先检查一下?这个消息什么时候发生?为什么呢?

C#中存储在此虚拟内存中的内容是什么,内存不足?

3 个答案:

答案 0 :(得分:11)

听起来你有某种记忆或资源泄漏。是时候打开一个分析器,看看消耗的资源或内存是什么。

好的个人资料包括

http://www.red-gate.com/products/dotnet-development/ants-performance-profiler

http://memprofiler.com/

- 这将附加到您的正在运行的进程中,并查看失控的内容。

通常,这类问题可能是由于IDisposable未通过调用Dispose()而处置的对象造成的。这些对象使用的内存和资源不受.NET垃圾收集器管理,因此(与常规.NET对象不同)它们不会被系统自动整理。

分析器通常会告诉您这是否是一个问题。

还有其他可能发生这种情况的情况,例如

  • 分配非常大的内存块,例如: 40Gb阵列
  • 没有机会正确进行垃圾收集的负载很重的系统可能会超出其虚拟内存分配。

同样,分析器会告诉您问题可能存在的位置。

答案 1 :(得分:2)

Windows使用Virtual Memory进行内存管理,但虚拟内存不是问题所在。这表明您的应用程序分配了大量内存 - 超过系统上可用的内存。

可能导致这种情况的一些事情:

  • 您正在某处无法释放内存的非托管代码。
  • 您分配了大量数据(例如,动态计算错误分配2GB数据的数组大小)。
  • 保持对缓冲区的引用比需要的时间长,这会阻止垃圾回收器回收内存。

如果不了解您的应用程序,则无法提供更详细的提示。

答案 2 :(得分:1)

显然你的应用程序占用了大量内存。您可以在此处阅读有关虚拟内存的信息:http://blogs.technet.com/b/markrussinovich/archive/2008/11/17/3155406.aspx