我的任務是改進一段代碼,以任何我認爲合適的方式生成大量報告。生成報告時診斷.NET OutOfMemoryException
有生成(對於每個數據庫的「部分」)大約10個相同的報告,以及用於它們的代碼是類似於:
GeneratePurchaseReport(Country.France, ProductType.Chair);
GC.Collect();
GeneratePurchaseReport(Country.France, ProductType.Table);
GC.Collect();
GeneratePurchaseReport(Country.Italy, ProductType.Chair);
GC.Collect();
GeneratePurchaseReport(Country.Italy, ProductType.Table);
GC.Collect();
如果刪除那些GC.Collect()
呼叫,報告服務崩潰與OutOfMemoryException
。
大部分內存保存在中,該內存填充在GeneratePurchaseReport
的內部,一旦退出就不再使用 - 這就是爲什麼完整的GC收集將回收內存的原因。
我的問題是雙重的:
- 爲什麼不GC做到這一點對自己?一旦它在第二個
GeneratePurchaseReport
上的內存不足,它應該在崩潰和燃燒之前做一個完整的收集,不是嗎? - 有沒有可以提高的內存限制?如果數據交換到磁盤,我一點都不介意,但.net進程使用的內存要少得多,甚至比可用的2.5GB內存少!我希望它只會在地址空間不足時崩潰,但在64位機器上我懷疑這種情況發生得太快。
那麼,當我只看標題時,我認爲你需要某種壓力 - 應用程序來嘗試爲測試目的燒錄內存。 – 2011-05-19 04:51:57
什麼是*** GeneratePurchaseReport ***? SSRS服務器中的本地報告RDLC或遠程RDL? – Kiquenet 2015-10-31 17:55:13
** GcHelper ** https://github.com/mcctomsk/MccTomskHelpers/blob/560a079172468fd44ce952fbfcd676d297602442/Core/GcHelper.cs注意:http://stackoverflow.com/questions/10016541/garbage-collection-not-happening-even什麼時候需要 和_之所以GC.Collect被調用兩次:http://stackoverflow.com/questions/3829928/under-what-circumstances-we-need-to-call-gc-collect-twice_ – Kiquenet 2015-11-02 11:33:23