为什么抛出OutOfMemoryException?

时间:2009-12-17 06:16:02

标签: .net memory-management

什么原因导致.NET运行时抛出OutOfMemoryException?垃圾收集器的工作是在分配对象之前根据需要清理内存和空闲内存;为什么它会出现内存不足?

3 个答案:

答案 0 :(得分:1)

我发现Eric Lippert的这个blog post非常有用。其中提到的一件事是(简化的)内存不足异常通常与过程无法获得足够大的内存块以满足其当前需求的事实有关。可能存在很多内存,但是碎片太小而无法使用。

答案 1 :(得分:0)

如果你使用的内存比你拥有的多,而且不要释放它...你最终会内存不足。 GC仅清除您不再引用的内容。

答案 2 :(得分:0)

垃圾收集器的工作要比在对象之后扫地更复杂。 gc还必须知道如何分配内存,确保应用程序的所有不同部分都有足够大小的块(考虑多个线程等)。

垃圾收集器还必须负责可靠地清理内存并以不会显着影响性能的方式执行此操作,并确保在尝试确定代码时不会在代码中引入更多“问题”什么记忆可以回收,什么不能。

这是一项很重要的工作,也是一项不容易或直接实施的工作。

对于您的特定点,OOM可能由于各种原因而发生,但是在一个表现相当好的应用程序中(即,不分配不合理的大小对象等),通常会发生这种情况,因为内存请求的发生频率高于GC可以合理调整实现它的可用内存,GC无法足够快地重新组装碎片块,以免失速。在这种情况下,GC被强制向应用程序报告和OOM,以防止更多的积压请求,并确保它永远不会赶上。