Code Bye

GC问题

描述:
1.写了一个简单的程序,Form1上放了一个Button, 事件中创建Form2窗口对象
2.每点击一次button内存会增长40KB左右,关闭form2时内存并没有减少。
3.重复2的操作20次后,内存占用会越来越多。
4.等待大致20分钟后观察内存,内存比最后一次操作只少了几十KB,内存并没有回到没操作的状态。
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 form = new Form2();
            form.ShowDialog();
        }

问题:
1.当关闭Form2后,我们并不会再使用到该对象。GC为什么没有回收。
2.GC假如不是即时回收,等待20多分钟 并没有作任何操作,GC 也并没有将没有使用的对象全部回收。
3.希望讲讲GC的原理。

解决方案

50

GC非常浪费CPU,所以当你内存比较大的时候,CLR并不会总是立刻GC,在时间和空间上找到平衡。

50

GC只会释放 托管的内存资源,对于那些非托管的,它没办法决定它的释放。例如,你的窗口句柄就属于非托管资源,要想显示释放资源,必须调用Dispose方法。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明GC问题