2011-03-01 17 views
3

在我的應用程序中,我需要將大文件(可以大約250MB)加載到內存中,我以懶惰的方式加載 - 當用戶要求查看文件時 - 我正在加載它。之後,每次用戶嘗試訪問該文件時,我都可以立即顯示它,因爲它已經位於內存中。 所以,問題是垃圾收集... 我加載的每個文件,我通過WeakReference加載, 但是: 我測試了幾次,我能夠加載大約3GB到內存中應用程序變得不可用),但GC沒有發生。我無法調用GC.Collect(2),因爲我無法確定調用它的時間,所以如何告訴GC在好時刻收集內存(弱引用)(該死的,3GB太多了......看起來好像GC只是不做他的工作) 熱點解決呢?我真的需要延遲加載,但是當進程使用超過1GB的內存時需要收集內存,或者類似的東西。LOH,WeakReferences,大型對象的垃圾回收

回答

1

有一個叫做GC.GetTotalMemory(bool forceFullCollection)http://msdn.microsoft.com/en-us/library/system.gc.gettotalmemory.aspx)的靜態函數。如果您已經通過了一些閾值,您可以在將新文件加載到內存之前使用它來強制垃圾收集。

編輯:一種可能實現

public MyFile GetMyFile(){ 
    if (!is_my_file_in_memory()) { 
     if (CG.GetTotalMemory(false) > MY_THRESHOLD) { 

     GC.Collect(2); 

     } 
     load_my_file_in_memory(); 
    } 
    return get_my_file_from_memory(); 
} 
+0

我提到的,我不能確定那一刻,迫使垃圾收集......這不是一個文件被加載後,收集內存是一個好主意,會有絕對沒有延遲加載 – 2011-03-01 16:51:56

+0

我提到你可以使用這個函數*之前*加載懶惰的文件到內存中:-) – linepogl 2011-03-01 16:55:47

+0

GC.GetTotalMemory(true)在下次文件加載沒有幫助...我仍然能夠加載3GB進入內存,然後應用程序凍結 – 2011-03-01 17:04:28