当前位置:编程学习 > C#/ASP.NET >>

请问每隔一分钟手动执行一次GC,合适吗??

现在有一个项目 设置的是每隔一分钟就手动执行一次GC垃圾回收(放在子线程中执行),我觉得有点时间间隔短了,如果有必要的话,隔多长时间 手动执行一次GC垃圾回收合适呢????


另外 我想问问 GC执行垃圾回收,会额外的消耗(耗费)资源(没存)吗???


求解答,希望大家各抒己见,不予吝啬.....


谢谢 大家的回复和建议.

  内存 资源 --------------------编程问答-------------------- 呵呵  GC.Collect 每次调用都会挂起所有工作线程 然后内存碎片整理 托管资源释放 而且频繁调用是消耗CPU的 --------------------编程问答-------------------- GC运行时,会挂起所有的用户线程,要压缩托管堆,非常耗费资源 --------------------编程问答-------------------- 并且频繁显示的调用对CPU占用更多,内存消耗更大,本身.net GC已经是优化了的,是一个非常复杂的过程,一旦发生调用就会去依次遍历3代内存根,然后对未有引用的内存块标记,然后调用终结器,最后将有引用的内存块提升一代。 --------------------编程问答--------------------
引用 2 楼 linrachel 的回复:
GC运行时,会挂起所有的用户线程,要压缩托管堆,非常耗费资源


引用 3 楼 yangjjfan 的回复:
并且频繁显示的调用对CPU占用更多,内存消耗更大,本身.net GC已经是优化了的,是一个非常复杂的过程,一旦发生调用就会去依次遍历3代内存根,然后对未有引用的内存块标记,然后调用终结器,最后将有引用的内存块提升一代。


.......这么复杂啊,那我还是劝组长 取消 每隔一分钟 手动 执行GC的过程了......


--------------------编程问答-------------------- 如果没有十足的理由不应该去调用GC.Collect 。
更不应该重复调用。 --------------------编程问答-------------------- 这样用的比较少,实在要用,也是用其他几个重载的方法收一下0代或者设置为优化模式 --------------------编程问答-------------------- 调用 GC.Collect 并不意味着一定立刻执行垃圾回收。 --------------------编程问答-------------------- 且不谈GC耗费资源 不能马上回收
如果你注意垃圾回收
在写代码的时候去注意及时Dispose对象,释放不要的资源
这比去统一某个时间去集中调GC回收更好 --------------------编程问答-------------------- GC是很耗资源的,再说你只能通知他要进行垃圾回收了,并不意味着能立马执行回收 --------------------编程问答--------------------
引用 7 楼 caozhy 的回复:
调用 GC.Collect 并不意味着一定立刻执行垃圾回收。


引用 8 楼 m_obj 的回复:
且不谈GC耗费资源 不能马上回收
如果你注意垃圾回收
在写代码的时候去注意及时Dispose对象,释放不要的资源
这比去统一某个时间去集中调GC回收更好


引用 9 楼 hjywyj 的回复:
GC是很耗资源的,再说你只能通知他要进行垃圾回收了,并不意味着能立马执行回收


调用GC只是通知它需要 回收垃圾了,什么时候回收,还是要它自己决定的吗? --------------------编程问答--------------------
引用 6 楼 dongxinxi 的回复:
这样用的比较少,实在要用,也是用其他几个重载的方法收一下0代或者设置为优化模式


周一 我去 看看 有哪几种 重载, 另外 优化模式 怎么设置呢?? --------------------编程问答--------------------
引用 4 楼 yan_hyz 的回复:
.......这么复杂啊,那我还是劝组长 取消 每隔一分钟 手动 执行GC的过程了......

别人不干正经事,你也没有必要提醒他。只参与他干的正经事,当他把时间消磨在画蛇添足的地方时,你应该考虑自己做点正经事或者换一个组。 --------------------编程问答-------------------- 去服务器上看一下性能计数器,比如你手动回收的是0代的,就看每秒发生了多少次0代的回收。如果你调用的频率远少于这个值(比如你提到的1分钟1次)是没有意义的;这样确定出一个大致的手动回收频率,再看你注重哪些参数来做微调 --------------------编程问答--------------------
引用 12 楼 sp1234 的回复:
引用 4 楼 yan_hyz 的回复:.......这么复杂啊,那我还是劝组长 取消 每隔一分钟 手动 执行GC的过程了......
别人不干正经事,你也没有必要提醒他。只参与他干的正经事,当他把时间消磨在画蛇添足的地方时,你应该考虑自己做点正经事或者换一个组。


可是 现在 就我们这个组在做 NET,别的组 是永别的语言写程序的.......

现在 我 就是 抽空就优化下代码,把冗余的代码 可以提取为字段的局部变量 整理出来,我觉得不能 所有的都交给 编译器去优化,虽然都是 大牛们的设计结果, 不过 我觉得 设计的时候 肯定 是选择的 折中 的 优化方式了


--------------------编程问答-------------------- 不是特殊需要的话,手动GC就是找抽~ --------------------编程问答-------------------- --------------------编程问答-------------------- 优化内存使用不能靠gc。靠的还是自己。
这个需要一些经验。说起来容易做起来难的活。 --------------------编程问答--------------------
引用 17 楼 zanfeng 的回复:
优化内存使用不能靠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 --------------------编程问答--------------------
引用 21 楼 quanben 的回复:
有自己的类需要Dispose么,另外有用到非托管资源了没?
另外确定Dispose都及时调了吗?
实在不行就要看代码了,这绘图具体是用了哪些东西。


GDI+ ,不停的定义局部变量Pen Brush,还有 自己定义的类,我现在 修改的是 需要 定义局部变量的 再用外后都 = null了,不需要定义为局部变量的提取成 字段了,不过对于 自定义的类,没有 自己 实现 Dispose,不知道这样 有没有效果 --------------------编程问答--------------------
引用 23 楼 kansousama 的回复:
代码可以优化
C# code?123456789101112131415161718192021class className : IDisposable //类名可以使用IDisposable 接口{        SqlClient sc = new SqlClient();//需要释放的全局变量         public void Dispose()     ……


USing,我倒是忘了这个了...... --------------------编程问答-------------------- 失败啊  失败~~~~~~~~~~~~~~~

我重新 提取 局部变量后 内存消耗 却更高了,多了 15M的内存使用量......





真伤心 --------------------编程问答-------------------- Pen、 Brush等对象(如果是这些造成内存消耗)有没有办法重复使用一下,而不要每次都重新创建(至少缓存一下)。 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 27 楼 quanben 的回复:
Pen、 Brush等对象(如果是这些造成内存消耗)有没有办法重复使用一下,而不要每次都重新创建(至少缓存一下)。


我在 类中 声明成为了 字段,只初始化 一次 ,以后每次 使用时,重新设置 属性 --------------------编程问答-------------------- 学习了,谢谢楼主。  --------------------编程问答-------------------- 合理使用using语句和dispose比主动调用gc.collect好。 --------------------编程问答--------------------
引用 31 楼 AisaC 的回复:
合理使用using语句和dispose比主动调用gc.collect好。


是的,现在 我抽空再给 以前 封装好的 类 增加 Dispose方法呢,在 使用结束后 都显示的调用Dispose
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,