[問題] 記憶體回收速度差強人意

作者: stu87616 (文組工程師)   2016-07-02 02:55:36
各位前輩好,小魯寫了一隻程式可以依我個人一些特殊需求來改變桌布,
實作的方法大概就是抓取指定的數張圖片,
使用 Drawing 裡面的方法將圖片拼接後輸出成圖檔,再設定其為桌布,
在拼接的過程中會 new 出幾個需要 Dispose 的物件,
由於來源也都是可以當成桌布的高畫質圖片,所以我蠻擔心記憶體的使用狀況
實際測試,每 5 分鐘運作一次圖片輸出,
開啟程式讓它運作後觀察工作管理員,剛啟動時約占用 30Mb,
當執行圖片拼接的程式後會飆升 10Mb 左右,
大概需要運作 1-3 次,也就是 40-60Mb 時,才會跳回 30Mb(執行記憶體回收?)
這算是正常使用的狀況,看起來沒有太大的問題,
但是我又測試了壓力狀況,將運作的頻率提高到 1 秒一次,
這下就精彩了,記憶體的用量根本直線上升,
待機什麼都不做只放著的話,可以衝到1G以上的用量,
但是時候差不多的時候,還是會乖乖跳回30Mb(儘管只有一瞬間),
所以可以推測應該是沒有 Memory Leak
是不是程式執行的頻率非常高,導致系統沒空或是還不確定是否能回收記憶?
我的code原則上都是用 using,或是用完就 Dispose 的寫法,
感覺程式這種表現不是很令人滿意,
是否有更快的方式命令系統把物件的記憶體吐出來呢?
作者: testPtt (測試)   2016-07-02 06:59:00
gc.collect()
作者: ssccg (23)   2016-07-02 08:47:00
記憶體還夠用幹麻急著要GC只要到一定的threshold就會GC,沒有沒空和不確定的問題
作者: testPtt (測試)   2016-07-02 14:13:00
建議win7以前的系統用就好
作者: O187 (187cm)   2016-07-02 19:10:00
gc太常用很耗效能,看你是想要效能好還是記憶體省
作者: smmoon (邦)   2016-07-11 11:48:00
固定的幾張圖片 輪流切換 有需要一直讀取 釋放嗎?..
作者: enonrick (EnonRick)   2016-07-11 14:29:00
memory usage 一直不是clr的強項,記憶體對它來說就是要拿來用的,gc.collect()是個 trade-off 的手段,如果是unplugged device,這方法未必適當,除了有 IDisposable的class 要手動 dispose 外,能放在 global 重覆用的就不要 new

Links booklink

Contact Us: admin [ a t ] ucptt.com