2011-02-09 41 views
1

完成使用該變量後,我可以在GC執行前儘早清理內存嗎?如何在c中儘早清除內存#

+0

是否要覆蓋內存內容,或者希望GC收集變量引用的對象? – 2011-02-09 09:34:27

+5

「清楚」是什麼意思?你的意思是「將內存內容清零以防止其他人在完成它之後讀取它」,或者你的意思是「釋放內存以便其可用於其他目的和隨後的內存分配」? – 2011-02-09 09:43:32

+2

幾乎沒有*有理由這樣做。你能解釋一下爲什麼你認爲你需要在GC之前清理內存? – 2011-02-09 10:12:47

回答

9

如果需要立即發佈特定資源,請實現IDisposable接口,並在某些對象(如流)上調用Dispose()(有時爲Close())。

如果您希望防止密碼超出其使用期限保留在內存中,SecureString支持此操作,儘管使用起來並不簡單。

否則,您無法控制垃圾收集器運行的時間或實際執行的操作。如果你迫切需要這種控制,你需要一個低級語言。

2

將其值設置爲null。如果找不到其他對該對象的引用,則GC將收集它(在下次GC運行期間)。但是你不能自己清除內存(非託管資源除外)。

1

您可以強制系統通過調用GC.Collect();

如果對象仍然引用它們不會被收集但是做一個掃描和評估所有對象,並考慮他們的收藏。

3

正如@Hinek說,你應該叫GC.Collect()。但是,如果您希望立即清除內存,它本身不會執行該部分。你應該叫:

//Force garbage collection. 
    GC.Collect(); 

    // Wait for all finalizers to complete before continuing. 
    GC.WaitForPendingFinalizers(); 
0

您可以使用此方法:使用此方法

public static void FlushMemory() 
    { 
     Process prs = Process.GetCurrentProcess(); 
     try 
     { 
      prs.MinWorkingSet = (IntPtr)(300000); 
     } 
     catch (Exception exception) 
     { 
      throw new Exception(); 
     } 
    } 

三路。

1 - 處置管理對象後,如類,....

2 - 創建與這種2000和間隔定時器。

3 - 創建線程來調用此方法。

我建議你在線程或計時器中使用這個方法。

0

正如@Mayank說使用這兩種

GC.Collect(); 
GC.WaitForPendingFinalizers(); 

由於該方案將不會繼續提高內存的使用,直到自由以前使用的內存。