什麼原因導致.NET運行時拋出OutOfMemoryException?垃圾收集器的工作是在分配對象之前根據需要清理內存並釋放內存;爲什麼它會出現內存不足?爲什麼會拋出OutOfMemoryException?
0
A
回答
1
我覺得這個blog post由Eric Lippert是相當豐富。其中提到的一點是(簡化):內存不足異常通常與過程無法獲得足夠滿足當前需求的內存塊有關。可能有很多內存可用,但碎片太小而無法使用。
0
如果你使用的內存比你多,並且沒有釋放它......你最終會失去內存。 GC只會清除您不再參考的內容。
0
垃圾收集器的工作比在對象之後清理更復雜。 gc還必須意識到如何分配內存,確保適用於應用程序的所有不同部分的足夠大小的塊(考慮多個線程等)。
垃圾回收器還必須負責可靠地清理內存,並以不會對性能產生顯着影響的方式進行操作,並確保它在嘗試執行代碼時不會在代碼中引入更多「問題」決定什麼內存可以回收和什麼不能。
它是一個很大的工作,並且不容易或直接實施。
對於您的具體情況,OOM可能因各種原因而發生,但在相當良好行爲的應用程序中(即不分配不合理大小的對象等)通常會發生,因爲內存請求比GC合理調整可用的內存來完成它,並且GC不能足夠快地重新分散碎塊以避免失速。在這種情況下,GC不得不向應用程序報告和OOM,以防止更多請求發生積壓並確保它永遠趕不上。
相關問題
- 1. 爲什麼FileOutputStream不會拋出OutOfMemoryException
- 2. 爲什麼StreamReader.ReadLine拋出OutOfMemoryException?
- 3. 爲什麼會拋出OOM?
- 4. 爲什麼會拋出AutomaticMigrationsDisabledException?
- 5. 爲什麼會拋出StringIndexOutOfBoundsException?
- 6. 爲什麼會拋出IndexOutOfBoundsException?
- 7. 爲什麼會拋出IndexOutOfBoundsException?
- 8. 爲什麼會拋出IllegalMonitorStateException?
- 9. 爲什麼會拋出java.lang.classCastException
- 10. 爲什麼會拋出NullPointerException?
- 11. 爲什麼會拋出ClassCastException?
- 12. 爲什麼會拋出InterruptedException?
- 13. 爲什麼會拋出System.FormatException?
- 14. 爲什麼會拋出InputMismatchException?
- 15. C++爲什麼會拋出?
- 16. 爲什麼會拋出StackOverflowError?
- 17. 爲什麼會拋出NullPointerException?
- 18. 爲什麼會拋出NullReferenceException?
- 19. 爲什麼會拋出OutOfMemory?
- 20. 爲什麼這段代碼拋出StackOverflowException而不是OutOfMemoryException?
- 21. 爲什麼Thread.Start可以拋出OutOfMemoryException異常
- 22. 爲什麼要創建一個新的數組拋出OutOfMemoryException?
- 23. SqlCommand ExecuteNonQuery拋出OutOfMemoryException
- 24. GrayScale(ColorMatrix)會導致OutOfMemoryException。爲什麼?
- 25. 爲什麼我會發生OutOfMemoryException?
- 26. 爲什麼會在這裏拋出NullPointerException?
- 27. 爲什麼textbox.focus會拋出lostFocus事件?
- 28. 爲什麼BeanUtils.copyProperties會拋出IllegalArgument異常?
- 29. 爲什麼System.Web.Hosting.ApplicationHost.CreateApplicationHost會拋出System.IO.FileNotFoundException?
- 30. 爲什麼DateTime.Now.TimeOfDay.ToString(「HH:mm:ss.ffffff」)會拋出FormatException?