GC.Collect()方法放在哪里比较合适

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

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

请大家多多指教啊
...全文
3376 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
mizuho_2006 2012-04-21
  • 打赏
  • 举报
回复
谢谢各位的宝贵意见,结贴散分
  • 打赏
  • 举报
回复
如果你使用Timer,可以适当注意少用占用窗体线程的Timer,多使用Threading.Timer。
xboxeer 2012-04-21
  • 打赏
  • 举报
回复
LZ可以看看自己new的对象是否有状态 如果没有状态干脆搞成静态的或者用单例 读写频繁那就看看是不是把非托管资源释放了
Timer这个没什么大问题
[Quote=引用 14 楼 的回复:]

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


我也发现自己程序写的不好,感觉都是面向过程的。像接口,或者是抽象类基本上不用。虽然我知道应该面向接口编程和面向抽象编程,但以前的思维总是改变不过来。总是觉得能……
[/Quote]
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

原来不能随便用的啊。由于以前没有用过,所以不太了解,谢谢各位高手的指点。

看来我只能优化以前的代码了。我的程序也没new什么特别大的对象,就是读写比较频繁,看来用GC是不合适了。

另外timer是不是不能随便滥用?我觉得会对性能造成影响。不过很多时候一些效果不用timer又实现不了。。
[/Quote]

读写比较频繁的代码,可以多使用异步处理各个具体处理(每一个具体处理都是一个很小的异步回调方法),不要写在一个大循环中。
mizuho_2006 2012-04-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
实际上我们如果发现总是调用很不寻常的底层代码,很多时候都是因为编程风格比较坏而造成的。我们应该修改编程基本原则,让系统自动给我们管理(例如自动决定GC行为),而不要靠想当然地手动调用更多的底层方法。
[/Quote]

我也发现自己程序写的不好,感觉都是面向过程的。像接口,或者是抽象类基本上不用。虽然我知道应该面向接口编程和面向抽象编程,但以前的思维总是改变不过来。总是觉得能实现功能就可以了,于是忽视了性能方面的问题。以后还要不断改进才行啊,还得请前辈们多指导啊。
  • 打赏
  • 举报
回复
实际上我们如果发现总是调用很不寻常的底层代码,很多时候都是因为编程风格比较坏而造成的。我们应该修改编程基本原则,让系统自动给我们管理(例如自动决定GC行为),而不要靠想当然地手动调用更多的底层方法。
mizuho_2006 2012-04-21
  • 打赏
  • 举报
回复
原来不能随便用的啊。由于以前没有用过,所以不太了解,谢谢各位高手的指点。

看来我只能优化以前的代码了。我的程序也没new什么特别大的对象,就是读写比较频繁,看来用GC是不合适了。

另外timer是不是不能随便滥用?我觉得会对性能造成影响。不过很多时候一些效果不用timer又实现不了。。
  • 打赏
  • 举报
回复
实际上,如果“效果很明显”仅仅是你看进程内存占用的瞬间数据的,那么大可不必注重这种“效果”。因为GC会自动被唤起,而手工调用Collect往往是在不恰当的时候去被调用,反而让你的程序变慢了。

你应该注意将应用程序逻辑单元细分,不要写一个1000行的大循环,而应该写100个只有10行的小程序来完成这个类似于循环的控制。这样,你也无需总是去给什么变量赋值为null。
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

哪都不放。
[/Quote]

同意。
xboxeer 2012-04-21
  • 打赏
  • 举报
回复
+1 手动设置为NULL可以加速GC判断对象是否还有引用 等GC执行的时候有效果
[Quote=引用 8 楼 的回复:]

先要给大对象设置为null,否则不起作用。
[/Quote]
dalmeeme 2012-04-21
  • 打赏
  • 举报
回复
先要给大对象设置为null,否则不起作用。
dalmeeme 2012-04-21
  • 打赏
  • 举报
回复
当你new出了个大对象,使用完毕后希望立即回收,释放内存,可以用一下GC.Collect(),效果很明显;

否则,一般都不用GC。
xboxeer 2012-04-21
  • 打赏
  • 举报
回复
你的内存都是非托管资源用掉了还是托管资源用掉了?
mizuho_2006 2012-04-21
  • 打赏
  • 举报
回复
那怎么才能优化自己的程序呢,只有改原来的代码了?
xboxeer 2012-04-21
  • 打赏
  • 举报
回复
你还想放在Timer里面放GC?那还不如让他去占用内存~
xboxeer 2012-04-21
  • 打赏
  • 举报
回复
强烈不建议放
种草德鲁伊 2012-04-21
  • 打赏
  • 举报
回复
哪都不放。
mizuho_2006 2012-04-21
  • 打赏
  • 举报
回复
自己顶一下。。

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧