日期:2014-05-18  浏览次数:20932 次

GC.Collect()方法放在哪里比较合适
程序运行占内存40多M,觉得应该手工清零内存优化一下,但是又不知道GC.Collect()放在哪里比较合适?

放在Try Catch语句的Finally语句块中?这么做的话要每个Try Catch里都手工回收一下吗?
放在timer中定时清理?这样操作太频繁(比如一秒一次)的话会不会GC.Collect()本身也会消耗内存降低效率?

请大家多多指教啊

------解决方案--------------------
当你new出了个大对象,使用完毕后希望立即回收,释放内存,可以用一下GC.Collect(),效果很明显;

否则,一般都不用GC。
------解决方案--------------------
+1 手动设置为NULL可以加速GC判断对象是否还有引用 等GC执行的时候有效果
探讨

先要给大对象设置为null,否则不起作用。

------解决方案--------------------
实际上,如果“效果很明显”仅仅是你看进程内存占用的瞬间数据的,那么大可不必注重这种“效果”。因为GC会自动被唤起,而手工调用Collect往往是在不恰当的时候去被调用,反而让你的程序变慢了。

你应该注意将应用程序逻辑单元细分,不要写一个1000行的大循环,而应该写100个只有10行的小程序来完成这个类似于循环的控制。这样,你也无需总是去给什么变量赋值为null。
------解决方案--------------------
LZ可以看看自己new的对象是否有状态 如果没有状态干脆搞成静态的或者用单例 读写频繁那就看看是不是把非托管资源释放了
Timer这个没什么大问题
探讨

引用:
实际上我们如果发现总是调用很不寻常的底层代码,很多时候都是因为编程风格比较坏而造成的。我们应该修改编程基本原则,让系统自动给我们管理(例如自动决定GC行为),而不要靠想当然地手动调用更多的底层方法。


我也发现自己程序写的不好,感觉都是面向过程的。像接口,或者是抽象类基本上不用。虽然我知道应该面向接口编程和面向抽象编程,但以前的思维总是改变不过来。总是觉得能……