最新评论
Re:是否可以完全相信垃圾回收?.Net 托管资源 非托管资源 垃圾回收 的疑问。 陆敏技 2011-03-24 13:49
1)哪些资源需要及时释放?这个问题很明确了,数据库连接,文件,还有其他的大家补充吧。就想到这么多。
Y.
2)WinForm背景下,如果创建的Form被释放(Form=null)的时候,Form内的字段(比如,String,DataTable,其他自定义类)是否会被自动释放(假设这些字段没有被其他的地方引用)。
不一定
3)因为从事的是数据库相关开发,自然用到最多的是ADO.Net,那么除了Connection,其他的对象是否需要及时释放,哪些对象是否需要及时释放(这里比较关心的是DataSet,DataTable)?
FCL中凡是提供了dispose模式的类型都应该显式及时释放。
4)补充一点如果上述很多对象都需要及时释放,那么垃圾回收的意义是不是就一定程度的降低了呢?
莫有降低。更多的类型,都没有实现dispose模式,所以需要垃圾回收器进行回收
Re:是否可以完全相信垃圾回收?.Net 托管资源 非托管资源 垃圾回收 的疑问。 一线风 2010-12-01 10:25
为什么.Net就不能提供一个主动释放和GC回收同时使用呢?
这样不就好多了?
可能是我想得太简单了吧!不过在ASP里用set o = nothing 时比较成就感。哈哈哈~
Re:是否可以完全相信垃圾回收?.Net 托管资源 非托管资源 垃圾回收 的疑问。 lindada 2010-11-08 13:14
GC的回收是不确定性的 但是不相信GC,就能确保自己的方式比它好吗!
同时老赵的意见 需要明确释放、而且耗费资源的没几个
所以相信GC吧
-------------------------------------------------------------
[url=http://www.columbiasportswearoutlet.org/]columbia sportswear outlet[/url] | [url=http://www.thenorthface-outlet.org/]north face outlet[/url]
Re:WinForm 三态树 行万里路 责任 创新 执着 2010-08-27 14:38
顶一下!
Re:是否可以完全相信垃圾回收?.Net 托管资源 非托管资源 垃圾回收 的疑问。 dannyr 2009-09-10 15:48
29楼,很好
re: WinForm 三态树 吉日嘎拉 2009-06-03 10:25
一看这空间就知道是一个小毛孩子,还到处去批评、辱骂人家,
哎,鄙视你。
哎,鄙视你。
re: 是否可以完全相信垃圾回收?.Net 托管资源 非托管资源 垃圾回收 的疑问。 缘清(aicken) 2009-04-30 09:08
你似乎有些概念不清,.Net GC的扫描与释放并不是一码事,文件、数据库等内置的非托管资源的释放也并不是由GC来完成的,只是由GC触发而已。
http://www.cnblogs.com/isline/archive/2009/03/03/1402350.html
http://www.cnblogs.com/isline/archive/2009/03/04/1402713.html
http://www.cnblogs.com/isline/archive/2009/03/03/1402350.html
http://www.cnblogs.com/isline/archive/2009/03/04/1402713.html
re: 是否可以完全相信垃圾回收?.Net 托管资源 非托管资源 垃圾回收 的疑问。 by 不要相信我 2009-04-27 09:58
强烈建议看下"李建忠"老师翻译的".Net框架程序设计"一书,里面对GC,拖管与非拖管(资源)等信息讲述的非常清楚晰...
我同意上面一位的意见,请相信"CLR的拉圾回收机制",我感觉GC性能不是我们最要关注的,机制才是最重要的,MS对于GC的性能在各版本中我感觉都会是提高的.只要我们正确出处我们的对象.....
还有一点,我个感觉拉圾回收是一个相当复杂的过程,其中牵扯到的问题也不是一时半会能说清楚的,比如说"根的概念,对象代龄,"等,都是值得好好研究的..
请多多指点...
我同意上面一位的意见,请相信"CLR的拉圾回收机制",我感觉GC性能不是我们最要关注的,机制才是最重要的,MS对于GC的性能在各版本中我感觉都会是提高的.只要我们正确出处我们的对象.....
还有一点,我个感觉拉圾回收是一个相当复杂的过程,其中牵扯到的问题也不是一时半会能说清楚的,比如说"根的概念,对象代龄,"等,都是值得好好研究的..
请多多指点...
re: 是否可以完全相信垃圾回收?.Net 托管资源 非托管资源 垃圾回收 的疑问。 新锐空间 2009-04-26 20:51
参考《框架设计(第2版)CLR Via C#》第20章 自动内存管理(垃圾收集) 能帮助理解。
re: 是否可以完全相信垃圾回收?.Net 托管资源 非托管资源 垃圾回收 的疑问。 breeze 2009-04-26 13:54
只能说回收时间不确定,这点在msdn上面有说明,程序员无法确定什么时候回收,除非手工调用。
re: 是否可以完全相信垃圾回收?.Net 托管资源 非托管资源 垃圾回收 的疑问。 mountaintai二世 2009-04-26 11:36
GC回收的对象是托管堆上的资源,也就是由CLR管理的内存资源。所以诸如数据库连接之类的资源都不是GC能够直接释放的。是对象本身释放的。对象通过实现IDisposable接口或者定义Finalize方法来告诉CLR在适当的时候(try/catch/finally语句中或者是由GC引起的Finalize方法)调用对象的Dispose或者Finalize函数,来释放这些资源。
所以,关于非托管堆上的资源,有以下论述:
1. 持有这些资源的对象负责清理他们,所以在问答ADO.net中哪些资源应该被释放的时候,应该查阅ADO.net的相关文档,来回答这些问题。
2. 清理对象的时机取决于调用者
a) 如果对象实现了IDisposable接口,那么try/catch/finally或者是using语句中,该对象的Dispose()方法会被调用,从而清理相关资源。
b) 如果对象实现了Finalize方法,那么当对象没有引用的时候,GC.Collect会触发Finalizer线程调用该对象的Finalize方法。但是要注意此时并不保证GC.Collect结束之后,该对象的Finaliz方法一定会被调用。原因我在这篇博客中交代了http://blog.csdn.net/mountaintaiII/archive/2009/04/13/4071271.aspx
所以,关于非托管堆上的资源,有以下论述:
1. 持有这些资源的对象负责清理他们,所以在问答ADO.net中哪些资源应该被释放的时候,应该查阅ADO.net的相关文档,来回答这些问题。
2. 清理对象的时机取决于调用者
a) 如果对象实现了IDisposable接口,那么try/catch/finally或者是using语句中,该对象的Dispose()方法会被调用,从而清理相关资源。
b) 如果对象实现了Finalize方法,那么当对象没有引用的时候,GC.Collect会触发Finalizer线程调用该对象的Finalize方法。但是要注意此时并不保证GC.Collect结束之后,该对象的Finaliz方法一定会被调用。原因我在这篇博客中交代了http://blog.csdn.net/mountaintaiII/archive/2009/04/13/4071271.aspx
re: 是否可以完全相信垃圾回收?.Net 托管资源 非托管资源 垃圾回收 的疑问。 xiao_p(未登录) 2009-04-25 22:33
就看楼上这样认真的回答楼主,我就得佩服一下,何况回答的还这么顺畅。
re: 是否可以完全相信垃圾回收?.Net 托管资源 非托管资源 垃圾回收 的疑问。 曲滨*銘龘鶽 2009-04-25 21:50
首先说明一下据我经验判断 .net 1.0 - 3.5 的垃圾回收机制算法存在一些差异的应该 2.0 以后更好一点
楼主搞错了一个问题 Dispose 并不是“释放”和C++ delete 不是一回事;
只要是 .net 的原生类或类型根本就没有手工释放的可能;
IDisposable 接口只是一个规约,不是强制的如果开放者并不遵守规约即便自己实现了 IDisposable 也是不会有啥作用的
如果你只实现了一个空的 IDisposable 一点用也没有
“释放”这个词在.net 只有对非托管资源才可以全称叫“释放非托管资源” 所以
但说“释放” 对托管资源来说是没意义也没作用的
这一点在 msdn 关于 IDisposable.Dispose 方法的帮助中已经很明确了、GC.SuppressFinalize 也有帮助
有人讨论过 GC.SuppressFinalize 是否可以使对象在GC 回收是排位提升,不过也是没啥结果
看完帮助就应该明白非托管资源开发者是可以释放的,而托管资源开发者是不可能释放的只能等GC释放(非常规做法除外)
一下是你的问题我也是个人经验回答,因为GC 具体到底怎么回事,ms 也在不断的改;
1)哪些资源需要及时释放?这个问题很明确了,数据库连接,文件,还有其他的大家补充吧。就想到这么多。
用到非托管资源的就应该及时释放
判断方法下面几种要多注意了;
需要联网的有网络通信的(必然要用WINDOWS API开端口啥的如 ADO.Net 下若干多谢)
读写本地文件的 io 下的若干对象
画图的 都是api 封装必然要释放
桌面应用的窗口控件( 都是占用 windows 句柄的)
不过这里是只释放非托管资源比如,窗口控件的win32句柄,Connection 的数据库连接句柄等
如果这些释放了其实对与这个类本身就无所谓的了因为累本身就是非托管的,要释放的并不是类本身
而是里面的或子对象需要释放的东西
2)WinForm背景下,如果创建的Form被释放(Form = null)的时候,Form内的字段(比如,String, DataTable, 其他自定义类)是否会被自动释放(假设这些字段没有被其他的地方引用)。
Form = null 是不建议的,最多 Dispose 就可以了,=null 好像更占用GC资源
至于变量如果你托提到窗口上的东西是会被制动 Dispose
而你自己声明的 Connection 这类实例变量,本身带有非托管资源的的东西要在 Form被Dispose 前手工释放;
3)因为从事的是数据库相关开发,自然用到最多的是ADO.Net,那么除了Connection,其他的对象是否需要及时释放,哪些对象是否需要及时释放(这里比较关心的是DataSet, DataTable)?
Connection Command DataReader DataAdapter 原则上系统提供的都是要Dispose 的;不过要是你自己实现 IDataReader 那就要看你怎么写的了
DataTable DataSet 本身其实不用 Dispose 、不过 Dispose 一下也可因为可以让 GC 优先考虑(据说啊!没确切的证实)
至于 DataSet 为啥实现 IDisposable 可能是给实体DataSet 或扩展之类的用的;
4)补充一点如果上述很多对象都需要及时释放,那么垃圾回收的意义是不是就一定程度的降低了呢?
一般系统实现 IDisposable 的你 using 就可以了不用老调用 GC 来搞
特殊说明:据我经验判定cpu 在100%长时间状态下,GC 工作是很缓慢的甚至是停滞的不过在2.0 后有所缓解;
楼主搞错了一个问题 Dispose 并不是“释放”和C++ delete 不是一回事;
只要是 .net 的原生类或类型根本就没有手工释放的可能;
IDisposable 接口只是一个规约,不是强制的如果开放者并不遵守规约即便自己实现了 IDisposable 也是不会有啥作用的
如果你只实现了一个空的 IDisposable 一点用也没有
“释放”这个词在.net 只有对非托管资源才可以全称叫“释放非托管资源” 所以
但说“释放” 对托管资源来说是没意义也没作用的
这一点在 msdn 关于 IDisposable.Dispose 方法的帮助中已经很明确了、GC.SuppressFinalize 也有帮助
有人讨论过 GC.SuppressFinalize 是否可以使对象在GC 回收是排位提升,不过也是没啥结果
看完帮助就应该明白非托管资源开发者是可以释放的,而托管资源开发者是不可能释放的只能等GC释放(非常规做法除外)
一下是你的问题我也是个人经验回答,因为GC 具体到底怎么回事,ms 也在不断的改;
1)哪些资源需要及时释放?这个问题很明确了,数据库连接,文件,还有其他的大家补充吧。就想到这么多。
用到非托管资源的就应该及时释放
判断方法下面几种要多注意了;
需要联网的有网络通信的(必然要用WINDOWS API开端口啥的如 ADO.Net 下若干多谢)
读写本地文件的 io 下的若干对象
画图的 都是api 封装必然要释放
桌面应用的窗口控件( 都是占用 windows 句柄的)
不过这里是只释放非托管资源比如,窗口控件的win32句柄,Connection 的数据库连接句柄等
如果这些释放了其实对与这个类本身就无所谓的了因为累本身就是非托管的,要释放的并不是类本身
而是里面的或子对象需要释放的东西
2)WinForm背景下,如果创建的Form被释放(Form = null)的时候,Form内的字段(比如,String, DataTable, 其他自定义类)是否会被自动释放(假设这些字段没有被其他的地方引用)。
Form = null 是不建议的,最多 Dispose 就可以了,=null 好像更占用GC资源
至于变量如果你托提到窗口上的东西是会被制动 Dispose
而你自己声明的 Connection 这类实例变量,本身带有非托管资源的的东西要在 Form被Dispose 前手工释放;
3)因为从事的是数据库相关开发,自然用到最多的是ADO.Net,那么除了Connection,其他的对象是否需要及时释放,哪些对象是否需要及时释放(这里比较关心的是DataSet, DataTable)?
Connection Command DataReader DataAdapter 原则上系统提供的都是要Dispose 的;不过要是你自己实现 IDataReader 那就要看你怎么写的了
DataTable DataSet 本身其实不用 Dispose 、不过 Dispose 一下也可因为可以让 GC 优先考虑(据说啊!没确切的证实)
至于 DataSet 为啥实现 IDisposable 可能是给实体DataSet 或扩展之类的用的;
4)补充一点如果上述很多对象都需要及时释放,那么垃圾回收的意义是不是就一定程度的降低了呢?
一般系统实现 IDisposable 的你 using 就可以了不用老调用 GC 来搞
特殊说明:据我经验判定cpu 在100%长时间状态下,GC 工作是很缓慢的甚至是停滞的不过在2.0 后有所缓解;
re: 是否可以完全相信垃圾回收?.Net 托管资源 非托管资源 垃圾回收 的疑问。 冰の酷龙 2009-04-25 20:58
@Gray Zhang
Gray已经说得很清楚了。 Silent Void说,上了贼船你还想咋的~哈
Gray已经说得很清楚了。 Silent Void说,上了贼船你还想咋的~哈
re: 是否可以完全相信垃圾回收?.Net 托管资源 非托管资源 垃圾回收 的疑问。 阿水 2009-04-25 14:51
*************谢谢大家的参与*******************
re: 是否可以完全相信垃圾回收?.Net 托管资源 非托管资源 垃圾回收 的疑问。 阿水 2009-04-25 14:51
@Silent Void 呵呵 谢谢你的参与。托管资源和非托管的这个我也算有了个比较清楚的理解。问题是实际使用时总觉得GC的自动回收效果不够好,总是有点担心。所以写了这个文章和大家讨论交交流,也能让同样有困惑的朋友一起分享。
re: 是否可以完全相信垃圾回收?.Net 托管资源 非托管资源 垃圾回收 的疑问。 Silent Void 2009-04-25 14:47
@阿水
还是这个问题:
释放非托管资源,跟GC回收托管堆上的对象,是两个不同概念。
非托管资源都需要手动释放。
既然你可以“不管了”,说明你已经达到了写本文的目的(标题)
我就一个打酱油的,一边躲猫猫去了。。。
还是这个问题:
释放非托管资源,跟GC回收托管堆上的对象,是两个不同概念。
非托管资源都需要手动释放。
既然你可以“不管了”,说明你已经达到了写本文的目的(标题)
我就一个打酱油的,一边躲猫猫去了。。。
re: 是否可以完全相信垃圾回收?.Net 托管资源 非托管资源 垃圾回收 的疑问。 阿水 2009-04-25 14:28
释放托管资源,MS建议是让GC自动处理。但是感觉这样有时候好像释放的慢。
不管了 就让GC自动回收吧。不过内存泄漏还是需要注意的。CLR Profile 用起来太慢,太耗内存了。
不管了 就让GC自动回收吧。不过内存泄漏还是需要注意的。CLR Profile 用起来太慢,太耗内存了。
re: 是否可以完全相信垃圾回收?.Net 托管资源 非托管资源 垃圾回收 的疑问。 Silent Void 2009-04-25 14:23
@阿水
文件,数据连接对象
----------------------------------
FileSteam、Connection是封装了非托管资源的托管对象,托管对象可以被GC回收,但非托管资源就一直持有,直到调用Dispose才被释放。
不及时释放这些资源会被占用的时间长,但是GC回收时,还是可以自动释放他们。
----------------------------------
能释放,那是因为这些类型定义中,定义了析构函数,这是析构函数的功劳。由析构函数在执行Dispose方法,你自己反汇编这些类型定义看看。
如果指望GC来回收用到的非托管资源的话,则记得给每个使用了非托管资源的类型定义一个析构函数,写之前去看看析构函数该怎么写——析构函数中调用Dispose来释放非托管资源。然后带来的是性能问题............................
话说回来,又回到这句话上:
释放非托管资源,跟GC回收托管堆上的对象,是两个不同概念。
问题是,开发过程中我们对于GC,是不是有特殊需要注意的地方。
---------------------------------------------------------
看我的第一条回复。
文件,数据连接对象
----------------------------------
FileSteam、Connection是封装了非托管资源的托管对象,托管对象可以被GC回收,但非托管资源就一直持有,直到调用Dispose才被释放。
不及时释放这些资源会被占用的时间长,但是GC回收时,还是可以自动释放他们。
----------------------------------
能释放,那是因为这些类型定义中,定义了析构函数,这是析构函数的功劳。由析构函数在执行Dispose方法,你自己反汇编这些类型定义看看。
如果指望GC来回收用到的非托管资源的话,则记得给每个使用了非托管资源的类型定义一个析构函数,写之前去看看析构函数该怎么写——析构函数中调用Dispose来释放非托管资源。然后带来的是性能问题............................
话说回来,又回到这句话上:
释放非托管资源,跟GC回收托管堆上的对象,是两个不同概念。
问题是,开发过程中我们对于GC,是不是有特殊需要注意的地方。
---------------------------------------------------------
看我的第一条回复。
re: 是否可以完全相信垃圾回收?.Net 托管资源 非托管资源 垃圾回收 的疑问。 阿水 2009-04-25 13:48
TO Silent Void 谢谢参与讨论,但是如果是CLR的类,不及时释放等GC来回收是没有问题的,包括文件,数据连接对象。只是说如果你不及时释放这些资源会被占用的时间长,但是GC回收时,还是可以自动释放他们。我文章里说 只要是CLR就可以被自动回收的,无论她控制的是什么资源。
问题是,开发过程中我们对于GC,是不是有特殊需要注意的地方。
问题是,开发过程中我们对于GC,是不是有特殊需要注意的地方。
