为什么会抛出OutOfMemoryException?
问题描述:
什么原因导致.NET运行时抛出OutOfMemoryException?垃圾收集器的工作是在分配对象之前根据需要清理内存并释放内存;为什么它会出现内存不足?为什么会抛出OutOfMemoryException?
答
如果你使用的内存比你多,并且没有释放它......你最终会失去内存。 GC只会清除您不再参考的内容。
答
垃圾收集器的工作比在对象之后清理更复杂。 gc还必须意识到如何分配内存,确保适用于应用程序的所有不同部分的足够大小的块(考虑多个线程等)。
垃圾回收器还必须负责可靠地清理内存,并以不会对性能产生显着影响的方式进行操作,并确保它在尝试执行代码时不会在代码中引入更多“问题”决定什么内存可以回收和什么不能。
它是一个很大的工作,并且不容易或直接实施。
对于您的具体情况,OOM可能因各种原因而发生,但在相当良好行为的应用程序中(即不分配不合理大小的对象等)通常会发生,因为内存请求比GC合理调整可用的内存来完成它,并且GC不能足够快地重新分散碎块以避免失速。在这种情况下,GC不得不向应用程序报告和OOM,以防止更多请求发生积压并确保它永远赶不上。