GC问题

nry19871012 2016-07-04 02:38:14
描述:
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的原理。
...全文
174 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lshfong 2016-07-04
  • 打赏
  • 举报
回复
你也可以在关闭窗口事件中强制释放资源
  • 打赏
  • 举报
回复
引用 2 楼 duanzi_peng 的回复:
GC只会释放 托管的内存资源,对于那些非托管的,它没办法决定它的释放。比如,你的窗口句柄就属于非托管资源,要想显示释放资源,必须调用Dispose方法。
.net 下的窗口对象在 GC 时会自动调用 dispose 方法,用不着自己调用。
  • 打赏
  • 举报
回复
空闲的内存空间会留着给以后的需求使用。没有这个概念,而以为凡是释放空间就是减少内存占用,看似挺合理,其实非常不合理。那其实反而是不了解如何保证系统效率的。
  • 打赏
  • 举报
回复
谁跟你说内存使用“回到没操作的状态”?!你使用数据库系统,如果你插入100万数据,然后删除99.99万数据,数据库系统占用的磁盘就会缩小到“最初只插入100数据的大小”吗? 根本没有这个说法。内存分配是根据一个初始值,然后每当不够时就加倍扩大,然后当清理了一些数据之后就把空闲的空间复用给新的申请要求。难道你认为凡是GC调用就花10分钟时间压缩一下内存空间、并且重启进程重新申请一遍进程内存空间吗?
  • 打赏
  • 举报
回复
你在关闭Form2的时候,在Form2d的Closed事件里调用dispose函数释放资源。
by_封爱 版主 2016-07-04
  • 打赏
  • 举报
回复
引用 2 楼 duanzi_peng 的回复:
GC只会释放 托管的内存资源,对于那些非托管的,它没办法决定它的释放。比如,你的窗口句柄就属于非托管资源,要想显示释放资源,必须调用Dispose方法。
既然你这样说.我有一个问题. 比如list<xxoo>这种泛型集合..我一直Add 到几百万几千万. 那么内存是不断增长的.. 这个时候 如何"释放"内存呢? 他是托管的 按照你的道理 GC是可以的是吧.
exception92 2016-07-04
  • 打赏
  • 举报
回复
GC只会释放 托管的内存资源,对于那些非托管的,它没办法决定它的释放。比如,你的窗口句柄就属于非托管资源,要想显示释放资源,必须调用Dispose方法。
threenewbee 2016-07-04
  • 打赏
  • 举报
回复
GC非常浪费CPU,所以当你内存比较大的时候,CLR并不会总是立刻GC,在时间和空间上找到平衡。
  • 打赏
  • 举报
回复
c、c++小程序的编程者实际上通常是从那些小程序的设计水平出发,觉得不释放内存“回到没操作的状态”就是bug了。 其实你应该记住这样一个软件工程基本常识,凡是实用的流行的平台,都不是这种低级的编程思路。其底层系统分配内存,并不是动不动就向windows操作系统重新申请进程内存(扩大一倍或者收缩一倍,都是如此)。更不是像没有高效率的内存管理机制、低级的c程序那样连几k字节也要纠结“释放”。
  • 打赏
  • 举报
回复
要搞懂所谓“释放资源”到底是什么意思,不要道听途说、仅凭觉得这个字眼儿比较响亮就滥用。你调用多少次 Dispose() 方法,都是一样的。因为人家 .net 本来就在 GC 销毁对象之前会自动调用 Dispose(),用不着你画蛇添足去调用。这跟个别的绘图画刷句柄不同。在.net中,有十万分之一的对象(例如画刷句柄)可能无法正常释放,所以你需要确保自己写代码释放(也并不保证成功)。剩下所有的东西都不需要画蛇添足去纠结什么释放。至少地,在你遇到bug时,不要盲目说什么“释放”。虽然说这个字眼儿并没有错,但是人家 .net 在 GC 时自动给你调用 Dispose() 了,那么你手动调用 Dispose() 方法有效果的概率顶多也就是十万分之一。你在解决问题、回答问题是用一个“永远没错的话”而蒙对解决方案的概率很低。 实际上,我不知道 lz 有没有关注过手机微信占用多少内存?它会在用户没有操作一段时间之后“回到没操作的状态”吗?这么重要的软件都是如此,这不就是一个常识嘛。 有些人用c、c++写了一点小程序,甚至刚刚学完课程,就来学一些c++编程者来刁难 .net、java 平台软件的什么“内存占用问题”了,引得一帮不明真相的群众也盲目跟风! 那么你就要想一想,像手机微信一直在手机上保持150M以上的内存占用,影响到大家喜爱它了么?为什么它不怕人刁难内存占用问题?

110,534

社区成员

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

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

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