none
請問一下 有關mobile的Memory的釋放與回收的問題 RRS feed

  • 問題

  • 最近在開發手機的應用程式

    我想請問一下各位

    如何解決OutOfException的問題

    比如說我有一個主Form暫稱為FormA (而配置給程式記憶體剩餘15M)

    執行時按下B按鈕會new出FormB來(記憶體剩餘變10M)

    當FormB被關閉時,記憶體剩餘還是10M,並不會因為FormB被Dispose()而釋放記憶體

    所以B按鈕只能被執行4次,第五次時就會出現 OutOfException 的錯誤功能

    我也曾嘗試過一些解決的方法

    方式(1)

    使用 GC物件的功能

    GC物件是用來回收記憶體的

    我在FormB關閉時Closed事件加入GC.Collect()想說這這樣應該可以強制執行回收機制

    但是這樣FormB關閉時依舊沒有釋放記憶體

     

    方式(2)

    或許是因為FormB裡面的元件還沒被Dispose()

    所以我在FormB關閉時Closed事件加入了以下的程式碼

     

    foreach(System.Windows.Forms.Control c in this.Controls)
                {
                    c.Dispose();
                }

    將FormB裡的東西全部抓出來Dispose()

    但依舊也沒辦法解決Memory被抓住不放的問題
    2008年9月26日 上午 10:33

解答

  • HI,

     

    您有試過丟棄FormB類別的物件嗎?

     

    FormB類別的物件.Dispose();

     

    如果還沒有效, 就要看看FormB類別是否有佔用大量的資源或記憶體

     

    tihs

    2008年9月26日 下午 01:28
  • 由 formB 耗用的記憶體程度來看,

    滿明顯的是 formB 載入了一些如圖片的 meta data,

    這些載入的圖片要透過類別本身的 dispose() 來進行釋放,

    例如 fromB 要關閉時的事情 Form_Closing,要加上這個 picturebox1.Image.Dispose();

    不然還是會有 memory leak 的情形發生。

     

    資源配置/釋放的原則:誰呼叫的就由誰來釋放。

     

    formB 的 Dispose() 呼叫的時機,

    最好是由產生該物件的呼叫者來進行釋放:

     

    Main() // FormA

    {

      frmFormB frm = new frmFormB();

      frm.ShowDialog();

      frm.Dispose();

    }

    2008年10月7日 上午 08:31
  • 沒有必要呼叫GC.Collect,.NETCF 的GC回收動作比.NET Framework快的多
    因此一定是你的資源沒有釋放

    你的方式二是在Closing或Closed事件裡面做的?
    一般Dispose動作,可以在Closing事件就做
    如果在Closed,容易發生ObjectDisposedException,因為物件已經被disposed了

    一般來說,FormB 沒辦法被釋放的原因可能是
    1. FormB 中的某些物件之參考仍被外部使用中
    2. 你呼叫了Native的函式,但未適當做收尾動作,導致memory leak

    請逐步將你的 FormB 程式碼註解掉,並重複測試,
    看看是哪些東西造成資源無法釋放
    有問題再回報,沒問題就告訴大家是哪裡的問題
    2008年10月8日 下午 01:44

所有回覆

  • HI,

     

    您有試過丟棄FormB類別的物件嗎?

     

    FormB類別的物件.Dispose();

     

    如果還沒有效, 就要看看FormB類別是否有佔用大量的資源或記憶體

     

    tihs

    2008年9月26日 下午 01:28
  • 有  也是加在FormB的Closed事件中

    加入this.Dispose();

    只不過關閉後仍然沒有釋放記憶體

    2008年9月27日 上午 03:17
  • HI,

     

    那就要看看FormB類別是否有佔用大量的資源或記憶體了

     

    tihs

    2008年9月27日 上午 09:28
  • 有試過在this.Dispose之後加上GC.collect嗎?

    如果FormB的使用率很高的話或許可以考慮看看不要重複的new/dispose,new一個出來之後不用的時候藏起來,第二次要使用時把它再叫出來,不去做重複new的動作。

    2008年10月6日 下午 03:06
    版主
  • 由 formB 耗用的記憶體程度來看,

    滿明顯的是 formB 載入了一些如圖片的 meta data,

    這些載入的圖片要透過類別本身的 dispose() 來進行釋放,

    例如 fromB 要關閉時的事情 Form_Closing,要加上這個 picturebox1.Image.Dispose();

    不然還是會有 memory leak 的情形發生。

     

    資源配置/釋放的原則:誰呼叫的就由誰來釋放。

     

    formB 的 Dispose() 呼叫的時機,

    最好是由產生該物件的呼叫者來進行釋放:

     

    Main() // FormA

    {

      frmFormB frm = new frmFormB();

      frm.ShowDialog();

      frm.Dispose();

    }

    2008年10月7日 上午 08:31
  • 沒有必要呼叫GC.Collect,.NETCF 的GC回收動作比.NET Framework快的多
    因此一定是你的資源沒有釋放

    你的方式二是在Closing或Closed事件裡面做的?
    一般Dispose動作,可以在Closing事件就做
    如果在Closed,容易發生ObjectDisposedException,因為物件已經被disposed了

    一般來說,FormB 沒辦法被釋放的原因可能是
    1. FormB 中的某些物件之參考仍被外部使用中
    2. 你呼叫了Native的函式,但未適當做收尾動作,導致memory leak

    請逐步將你的 FormB 程式碼註解掉,並重複測試,
    看看是哪些東西造成資源無法釋放
    有問題再回報,沒問題就告訴大家是哪裡的問題
    2008年10月8日 下午 01:44