none
記憶體飆升 RRS feed

  • 問題

  • 大大您們好,我想請問一下,當我開某一功能Form1時(處理很多物件),在工作管理員-->處理程序裡的記憶體,看到會從30M跑到80M左右,但當USER跑到別的Form2時,我會將Form1關閉並釋放,
    物件釋放的方式:  有一全域變數的介面宣告 private IFormCommon MyIFormCommon;
                            所有Form都是區域變數,要用時會先將MyIFormCommon = Form1;
                            按下另一Form時, 先將前一個Form做釋放動作 MyIFormCommon = null;  MyIFormCommon = Form2;        
                                                                                       //GC.Collect(); //有寫沒寫都試過
    但即使我有做這些動作,為何我的記憶體仍不會減少,是因為我沒釋放到嗎,由於下一次在進去就會破百了,請問大大是我的觀念錯了,還是有其他原因,謝謝。
    (我有在網路上搜尋到,利用API的SetProcessWorkingSetSize,確實可以馬上減少,但這個方法有有人說有些問題,所以想從程式上修改,請大大幫幫我,謝謝)


    2011年4月1日 上午 09:42

解答

  • 這表示你的Form1本身有執行緒未終止,或是有其他地方也參考到Form1實體.
    某些時候是元件造成的,原因千奇百怪,建議你先單純的把form1程式獨立出來執行測試,先確認是否是form本身未釋放,再進一步找出問題點.
    • 已標示為解答 冰糖旋風 2011年4月6日 上午 01:14
    2011年4月1日 上午 09:50
  • GC.Collect 能幫你將已經釋放的記憶體還給系統。

    .Net 並不會立刻將已經釋放的記憶體還給系統,而是等到有空的時候,大部分的情況是在執行檔關閉後,才會將記憶體還給系統。

    如果你並沒有正確釋放記憶體,那麼呼叫 GC.Collect 也是沒用的。

    一般記憶體快速膨脹,大概就是:

    1. 不當的 SQL 語法造成資料庫讀取量過大。

    2. 過度的字串或記憶體串流寫入,造成記憶體過大。

    3. 圖片未做區域放大,而是直接條大整張圖片,例如透過 PictureBox 調高圖片放大的比例。

    4. 自行呼叫 UnManaged 的部分沒正確釋放。

     

    關閉 MyIFormCommon 要呼叫 Form.Close / Form.Dispose ,你只有用:MyIFormCommon =  null 只是將 MyIFormCommon 這個參照變數變更為無參照,讓 Form1 的參照數量減 1 ,並沒有關閉或釋放的行為。

    請敘述你在 Form1 做了哪些事,明確列出關閉的程式碼,這樣才能討論。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 冰糖旋風 2011年4月6日 上午 01:14
    2011年4月3日 下午 12:59
  • 參考以下幾篇關於Memory Leak的文章

    http://www.codeproject.com/KB/dotnet/Memory_Leak_Detection.aspx

    http://blogs.msdn.com/b/tess/archive/2006/01/23/net-memory-leak-case-study-the-event-handlers-that-made-the-memory-baloon.aspx

    http://support.microsoft.com/kb/318263


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 冰糖旋風 2011年4月6日 上午 01:14
    2011年4月5日 上午 11:11
    版主

所有回覆

  • 這表示你的Form1本身有執行緒未終止,或是有其他地方也參考到Form1實體.
    某些時候是元件造成的,原因千奇百怪,建議你先單純的把form1程式獨立出來執行測試,先確認是否是form本身未釋放,再進一步找出問題點.
    • 已標示為解答 冰糖旋風 2011年4月6日 上午 01:14
    2011年4月1日 上午 09:50
  • 恩 大大謝謝,我試試看,有問題再拜託你了,謝謝
    2011年4月1日 上午 10:04
  • GC.Collect
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年4月1日 下午 12:39
  • 大大您好,GC.Collect我有試過真的沒用(在我提問的地方有寫),不過我將兩個form去新開一個專案去試,結果真的沒有釋放的感覺,因為ram一直加大,不過我會在試試看,有想法再請教大大們,謝謝
    2011年4月3日 上午 11:37
  • GC.Collect 能幫你將已經釋放的記憶體還給系統。

    .Net 並不會立刻將已經釋放的記憶體還給系統,而是等到有空的時候,大部分的情況是在執行檔關閉後,才會將記憶體還給系統。

    如果你並沒有正確釋放記憶體,那麼呼叫 GC.Collect 也是沒用的。

    一般記憶體快速膨脹,大概就是:

    1. 不當的 SQL 語法造成資料庫讀取量過大。

    2. 過度的字串或記憶體串流寫入,造成記憶體過大。

    3. 圖片未做區域放大,而是直接條大整張圖片,例如透過 PictureBox 調高圖片放大的比例。

    4. 自行呼叫 UnManaged 的部分沒正確釋放。

     

    關閉 MyIFormCommon 要呼叫 Form.Close / Form.Dispose ,你只有用:MyIFormCommon =  null 只是將 MyIFormCommon 這個參照變數變更為無參照,讓 Form1 的參照數量減 1 ,並沒有關閉或釋放的行為。

    請敘述你在 Form1 做了哪些事,明確列出關閉的程式碼,這樣才能討論。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 冰糖旋風 2011年4月6日 上午 01:14
    2011年4月3日 下午 12:59
  • 參考以下幾篇關於Memory Leak的文章

    http://www.codeproject.com/KB/dotnet/Memory_Leak_Detection.aspx

    http://blogs.msdn.com/b/tess/archive/2006/01/23/net-memory-leak-case-study-the-event-handlers-that-made-the-memory-baloon.aspx

    http://support.microsoft.com/kb/318263


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 冰糖旋風 2011年4月6日 上午 01:14
    2011年4月5日 上午 11:11
    版主
  • 大大謝謝,利用programlin方式後,又經過你的提點,發現如同你說的,我並沒有做關閉的動作,謝謝
    2011年4月6日 上午 01:16