[问题] 内存回收速度差强人意

楼主: 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