请问每隔一分钟手动执行一次GC,合适吗??
现在有一个项目 设置的是每隔一分钟就手动执行一次GC垃圾回收(放在子线程中执行),我觉得有点时间间隔短了,如果有必要的话,隔多长时间 手动执行一次GC垃圾回收合适呢????另外 我想问问 GC执行垃圾回收,会额外的消耗(耗费)资源(没存)吗???
求解答,希望大家各抒己见,不予吝啬.....
谢谢 大家的回复和建议.
内存 资源 --------------------编程问答-------------------- 呵呵 GC.Collect 每次调用都会挂起所有工作线程 然后内存碎片整理 托管资源释放 而且频繁调用是消耗CPU的 --------------------编程问答-------------------- GC运行时,会挂起所有的用户线程,要压缩托管堆,非常耗费资源 --------------------编程问答-------------------- 并且频繁显示的调用对CPU占用更多,内存消耗更大,本身.net GC已经是优化了的,是一个非常复杂的过程,一旦发生调用就会去依次遍历3代内存根,然后对未有引用的内存块标记,然后调用终结器,最后将有引用的内存块提升一代。 --------------------编程问答--------------------
.......这么复杂啊,那我还是劝组长 取消 每隔一分钟 手动 执行GC的过程了......
--------------------编程问答-------------------- 如果没有十足的理由不应该去调用GC.Collect 。
更不应该重复调用。 --------------------编程问答-------------------- 这样用的比较少,实在要用,也是用其他几个重载的方法收一下0代或者设置为优化模式 --------------------编程问答-------------------- 调用 GC.Collect 并不意味着一定立刻执行垃圾回收。 --------------------编程问答-------------------- 且不谈GC耗费资源 不能马上回收
如果你注意垃圾回收
在写代码的时候去注意及时Dispose对象,释放不要的资源
这比去统一某个时间去集中调GC回收更好 --------------------编程问答-------------------- GC是很耗资源的,再说你只能通知他要进行垃圾回收了,并不意味着能立马执行回收 --------------------编程问答--------------------
调用GC只是通知它需要 回收垃圾了,什么时候回收,还是要它自己决定的吗? --------------------编程问答--------------------
周一 我去 看看 有哪几种 重载, 另外 优化模式 怎么设置呢?? --------------------编程问答--------------------
别人不干正经事,你也没有必要提醒他。只参与他干的正经事,当他把时间消磨在画蛇添足的地方时,你应该考虑自己做点正经事或者换一个组。 --------------------编程问答-------------------- 去服务器上看一下性能计数器,比如你手动回收的是0代的,就看每秒发生了多少次0代的回收。如果你调用的频率远少于这个值(比如你提到的1分钟1次)是没有意义的;这样确定出一个大致的手动回收频率,再看你注重哪些参数来做微调 --------------------编程问答--------------------
可是 现在 就我们这个组在做 NET,别的组 是永别的语言写程序的.......
现在 我 就是 抽空就优化下代码,把冗余的代码 可以提取为字段的局部变量 整理出来,我觉得不能 所有的都交给 编译器去优化,虽然都是 大牛们的设计结果, 不过 我觉得 设计的时候 肯定 是选择的 折中 的 优化方式了
--------------------编程问答-------------------- 不是特殊需要的话,手动GC就是找抽~ --------------------编程问答-------------------- --------------------编程问答-------------------- 优化内存使用不能靠gc。靠的还是自己。
这个需要一些经验。说起来容易做起来难的活。 --------------------编程问答--------------------
那就要在平时写代码的时候养成 好习惯啦。 --------------------编程问答-------------------- 学习了,谢谢楼主。 --------------------编程问答-------------------- 但是频繁绘图,没使用GC,虽然有写dispose,但是内存还是会飚上去,要等很久才会降下来!看那些内存浪费,实在是看不下去! --------------------编程问答-------------------- 有自己的类需要Dispose么,另外有用到非托管资源了没?
另外确定Dispose都及时调了吗?
实在不行就要看代码了,这绘图具体是用了哪些东西。 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 代码可以优化
class className : IDisposable //类名可以使用IDisposable 接口
{
SqlClient sc = new SqlClient();//需要释放的全局变量
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
if (sc != null)
sc.Dispose();//释放
}
~className()
{
Dispose(false);
}
}
也可以使用Using --------------------编程问答--------------------
GDI+ ,不停的定义局部变量Pen Brush,还有 自己定义的类,我现在 修改的是 需要 定义局部变量的 再用外后都 = null了,不需要定义为局部变量的提取成 字段了,不过对于 自定义的类,没有 自己 实现 Dispose,不知道这样 有没有效果 --------------------编程问答--------------------
USing,我倒是忘了这个了...... --------------------编程问答-------------------- 失败啊 失败~~~~~~~~~~~~~~~
我重新 提取 局部变量后 内存消耗 却更高了,多了 15M的内存使用量......
真伤心 --------------------编程问答-------------------- Pen、 Brush等对象(如果是这些造成内存消耗)有没有办法重复使用一下,而不要每次都重新创建(至少缓存一下)。 --------------------编程问答-------------------- --------------------编程问答--------------------
我在 类中 声明成为了 字段,只初始化 一次 ,以后每次 使用时,重新设置 属性 --------------------编程问答-------------------- 学习了,谢谢楼主。 --------------------编程问答-------------------- 合理使用using语句和dispose比主动调用gc.collect好。 --------------------编程问答--------------------
是的,现在 我抽空再给 以前 封装好的 类 增加 Dispose方法呢,在 使用结束后 都显示的调用Dispose
补充:.NET技术 , C#