2014-11-05 54 views
4

我目前正在使用Windows Phone 8.我正面臨一些與內存有關的問題。內存沒有被自動釋放在Windows Phone 8

讓我有兩個PhoneApplicationPages。這兩個頁面都包含圖像,文本塊等。假設當我在第1頁時,我的應用程序正在使用30MB的內存。如果我從第1頁導航到第2頁,則已使用的內存量增加到35MB。然後當我回到第1頁時,使用的內存仍然是35MB。

爲什麼內存或緩存未被自動釋放?有沒有辦法手動清除內存或緩存?

(PS:這兩個被代表頁面的類是靜態的,我在OnNavigatedFrom方法將它們設置爲null)

回答

3

從這個link

的垃圾收集器( GC)完全免除了開發者 跟蹤內存使用情況並知道何時釋放內存。

微軟? .NET CLR(Common Language Runti me)要求所有 資源都從託管堆中分配。您永遠不會從託管堆對象中釋放對象 ,因爲它們不是 應用程序所需的更長時間時會自動釋放對象。

記憶力不是無限的。垃圾收集器必須執行一個 集合以釋放一些內存。垃圾收集器的 優化引擎根據所做的分配確定執行收集的最佳時間, (確切的標準由Microsoft保護)。

基本上,垃圾收集器從系統中釋放內存,但它始終處於非活動狀態,因爲它會影響性能。

您可以通過調用GC.Collect();方法強制GC進行收集,如解釋here所述。

現在,迫使垃圾收集器執行是不是一個好主意,但是你可以通過使用class destructor幫助它:

class YourClass 
{ 
    ~YourClass() // destructor 
    { 
     // cleanup statements. 
    } 
} 
+1

析構函數如何提供幫助? – lisp 2014-11-05 11:42:56

4

對於一些原因,我不知道的,運行時保持一個參考你的頁面有一段時間,即使頁面已從背面堆棧中刪除後。我已經證明這種行爲在這裏我的發現:http://blogs.codes-sources.com/kookiz/archive/2013/11/11/wpdev-give-that-memory-back.aspx

長話短說,下面的代碼,如果你想立即回收內存添加到您的網頁:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
{ 
    base.OnNavigatedTo(e); 

    this.Dispatcher.BeginInvoke(() => 
    { 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 

     this.Dispatcher.BeginInvoke(() => 
     { 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 

      this.Dispatcher.BeginInvoke(() => 
      { 
       GC.Collect(); 
       GC.WaitForPendingFinalizers(); 
      }); 
     }); 
    }); 
} 

請注意,這不是一個真正的泄漏,即使你不使用這些代碼,你的內存最終也會被釋放(通常在三次頁面導航之後)。但是,儘早釋放內存可以真正幫助內存密集型應用程序。