2012-01-06 19 views
0

我已經制作了一個簡單的.net應用程序,它從數據庫獲取數據並保存爲excel文檔。我注意到的問題是,一旦過程完成並生成電子表格,應用程序就會消耗約750MB的內存。它正在整理一個大的報告,但是我認爲一旦它保存了內存就被釋放了?.Net c#應用程序在完成過程後使用太多內存

這是這種情況?

謝謝

+0

你從哪裏得到'750 MB的內存'?您可能正在查看「Working Set」,因爲即使它們未被使用,頁面仍保留在進程的工作集中,這將是一個不好的指標。確保你正在查看私人字節 – 2012-01-06 15:25:30

回答

2

在.Net內存不一定會自動釋放。

您可以嘗試使用Dispose()實現IDisposable的所有大對象和/或清空對這些實例的任何引用,然後調用GC.Collect()來強制立即進行垃圾回收。 可能會在您完成對大對象的引用時提供幫助

+1

如果你打算把它投下來,請提供一個關於答案有什麼問題的評論。就我而言,這個答案更適合對原始問題發表評論。 – RQDQ 2012-01-06 15:25:51

+0

我幾乎立即得到2個downvotes。我真的很感謝downvoters至少留下了一個評論,說明我在錯誤的方向前進。 – 2012-01-06 15:29:57

+0

@DennisTraub它更適合作爲評論,因爲你提出的問題並沒有提供直接的答案。 – msarchet 2012-01-06 15:30:37

2

內存不會立即由Garabage Collector釋放。

另外你是否確保你正確處理所有的對象,並允許垃圾收集器拿起物品。在你保存後的想法中,如果該項目仍被應用程序中的某些內容引用,則無關緊要。

+1

特別是Excel資源,因爲這些可能會佔用大量內存並可能是原因 – w69rdy 2012-01-06 15:25:53

+0

這是真的。我有一個後臺工作人員正在運行以生成excel文檔。垃圾收集器將運行以釋放不再由應用程序使用的任何內存? GC.Collect()(來自下面的帖子) – MrPink 2012-01-06 15:38:43

1

如果數據仍然被引用和應用程序使用,那麼內存不會被垃圾收集。見garbage collection

另請參閱this previous question可能有幫助嗎?我發現它非常有用,特別是Igor Zevaka的回答。

0

檢查定義。例如,如果你在你的代碼中定義了表單,它會使用很多內存,因爲很多時候都是以相同的形式開始的。

例如;我的應用程序中有3種形式。 Form1,Form2和Form3。

namespace RAMAPP 
{ 
    public partial class RAMAPP : Form 
    { 
     Form1 first = new Form1(); 
     Form2 second = new Form2(); 
     Form3 third = new Form3(); 

    public RAMAPP() 
    { 
     InitializeComponent(); 
    } 
} 
} 

在這裏,當您點擊開始按鈕時,程序將讀取您現在寫入的所有行。在開始之前,將RAMAPP程序定義爲第一,第二和第三。問題是在初始化之前定義這些表單。 您應該在初始化之前刪除所有表單定義。 在此之後,重新啓動您的程序,它將有望運行:)

相關問題