社区
C#
帖子详情
GC.Collect()方法放在哪里比较合适
mizuho_2006
2012-04-21 04:24:26
程序运行占内存40多M,觉得应该手工清零内存优化一下,但是又不知道GC.Collect()放在哪里比较合适?
放在Try Catch语句的Finally语句块中?这么做的话要每个Try Catch里都手工回收一下吗?
放在timer中定时清理?这样操作太频繁(比如一秒一次)的话会不会GC.Collect()本身也会消耗内存降低效率?
请大家多多指教啊
...全文
3376
18
打赏
收藏
GC.Collect()方法放在哪里比较合适
程序运行占内存40多M,觉得应该手工清零内存优化一下,但是又不知道GC.Collect()放在哪里比较合适? 放在Try Catch语句的Finally语句块中?这么做的话要每个Try Catch里都手工回收一下吗? 放在timer中定时清理?这样操作太频繁(比如一秒一次)的话会不会GC.Collect()本身也会消耗内存降低效率? 请大家多多指教啊
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
mizuho_2006
2012-04-21
打赏
举报
回复
谢谢各位的宝贵意见,结贴散分
以专业开发人员为伍
2012-04-21
打赏
举报
回复
如果你使用Timer,可以适当注意少用占用窗体线程的Timer,多使用Threading.Timer。
xboxeer
2012-04-21
打赏
举报
回复
LZ可以看看自己new的对象是否有状态 如果没有状态干脆搞成静态的或者用单例 读写频繁那就看看是不是把非托管资源释放了
Timer这个没什么大问题
[Quote=引用 14 楼 的回复:]
引用 13 楼 的回复:
实际上我们如果发现总是调用很不寻常的底层代码,很多时候都是因为编程风格比较坏而造成的。我们应该修改编程基本原则,让系统自动给我们管理(例如自动决定GC行为),而不要靠想当然地手动调用更多的底层方法。
我也发现自己程序写的不好,感觉都是面向过程的。像接口,或者是抽象类基本上不用。虽然我知道应该面向接口编程和面向抽象编程,但以前的思维总是改变不过来。总是觉得能……
[/Quote]
以专业开发人员为伍
2012-04-21
打赏
举报
回复
[Quote=引用 12 楼 的回复:]
原来不能随便用的啊。由于以前没有用过,所以不太了解,谢谢各位高手的指点。
看来我只能优化以前的代码了。我的程序也没new什么特别大的对象,就是读写比较频繁,看来用GC是不合适了。
另外timer是不是不能随便滥用?我觉得会对性能造成影响。不过很多时候一些效果不用timer又实现不了。。
[/Quote]
读写比较频繁的代码,可以多使用异步处理各个具体处理(每一个具体处理都是一个很小的异步回调方法),不要写在一个大循环中。
mizuho_2006
2012-04-21
打赏
举报
回复
[Quote=引用 13 楼 的回复:]
实际上我们如果发现总是调用很不寻常的底层代码,很多时候都是因为编程风格比较坏而造成的。我们应该修改编程基本原则,让系统自动给我们管理(例如自动决定GC行为),而不要靠想当然地手动调用更多的底层方法。
[/Quote]
我也发现自己程序写的不好,感觉都是面向过程的。像接口,或者是抽象类基本上不用。虽然我知道应该面向接口编程和面向抽象编程,但以前的思维总是改变不过来。总是觉得能实现功能就可以了,于是忽视了性能方面的问题。以后还要不断改进才行啊,还得请前辈们多指导啊。
以专业开发人员为伍
2012-04-21
打赏
举报
回复
实际上我们如果发现总是调用很不寻常的底层代码,很多时候都是因为编程风格比较坏而造成的。我们应该修改编程基本原则,让系统自动给我们管理(例如自动决定GC行为),而不要靠想当然地手动调用更多的底层方法。
mizuho_2006
2012-04-21
打赏
举报
回复
原来不能随便用的啊。由于以前没有用过,所以不太了解,谢谢各位高手的指点。
看来我只能优化以前的代码了。我的程序也没new什么特别大的对象,就是读写比较频繁,看来用GC是不合适了。
另外timer是不是不能随便滥用?我觉得会对性能造成影响。不过很多时候一些效果不用timer又实现不了。。
以专业开发人员为伍
2012-04-21
打赏
举报
回复
实际上,如果“效果很明显”仅仅是你看进程内存占用的瞬间数据的,那么大可不必注重这种“效果”。因为GC会自动被唤起,而手工调用Collect往往是在不恰当的时候去被调用,反而让你的程序变慢了。
你应该注意将应用程序逻辑单元细分,不要写一个1000行的大循环,而应该写100个只有10行的小程序来完成这个类似于循环的控制。这样,你也无需总是去给什么变量赋值为null。
以专业开发人员为伍
2012-04-21
打赏
举报
回复
[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
打赏
举报
回复
自己顶一下。。
【ASP.NET编程知识】.Net的
GC
垃圾回收原理及实现.docx
为了考虑到应用程序当前的稳定运行,执行
GC
.
Coll
ect
并不一定马上产生效果,这里仅仅是一个触发,会去收集将要回收的对象,回收动作会在未来某个
合适
的时间段进行。 八、
GC
.
Coll
ect
方法
的参数
GC
.
Coll
ect
方法
的...
asp.net中C#实现手动回收内存的
方法
然而,需要注意的是,.NET运行时垃圾回收器拥有自己的算法来决定何时进行垃圾回收,因此即使调用了System.
GC
.
Coll
ect
方法
,垃圾回收器也可能不会立即执行,尤其是当系统资源处于紧张状态时。 在使用System.
GC
....
Java高级知识
- 使用
合适
的
GC
算法,如CMS、G1等。 **1.1.3 Java工具** - **命令行工具** - `jps`: 显示当前运行的JVM进程 - `jstack`: 获取指定PID的线程栈信息 - `jmap`: 生成heap dump文件,查看对象实例信息 - `jconsole`...
Pro .NET Memory Management
- **手动清理**:虽然.NET提供了自动化的垃圾回收机制,但在某些情况下,手动调用
GC
.
Coll
ect
()
方法
可以帮助及时清理不再使用的对象。 #### 四、总结 通过深入学习《Pro .NET Memory Management》,开发者可以更加...
Unity优化:
GC
.
Coll
ect
()避坑指南
摘要: 本文深入讲解Unity中System.
GC
.
Coll
ect
()的使用优化与内存管理策略。
GC
.
Coll
ect
()虽能强制回收内存,但滥用会导致严重卡顿,尤其在移动端。合理使用场景包括:1)场景切换前后清理旧资源;2)批量卸载大型...
C#
111,126
社区成员
642,541
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章