VB.NET如何销毁自己写的类

时间:2021-11-26 14:04:24
我做了个实验,实例化类前是2000K的内存,实例化后是25000K的内存,把类里面的控件全部Dispose后是20000K的内存,这18000K的内存怎么回收?(我那个类里面有好多WithEvents的控件和变量,还有事件,方法和属性)

11 个解决方案

#1


不仅仅是Dispose那么简单
首先在你的类首次实例化时,有没有考虑到从托管代码编译到本地代码的过程
释放的只是对象,但用到过的托管代码会缓存起来,使以后加载更快
想完全回收“18000K”不太可能
当然这只是一方面

#2


本帖最后由 wuyazhe 于 2010-08-30 11:10:26 编辑
你还为这个纠结呢。
内存会在垃圾回收器认为合适的时候回收,如果你认为某个操作不是频繁发生的,可以调用
GC.Collect()
GC.WaitForFullGCComplete()

比如关闭窗体后,执行以上代码。

#3


郁闷,用IDispose不但没释放资源,还增加了几十K...加个GC.Collect就释放了,还是自己写Dispose算了,把一些变量设为Nothing还剩下10000K了,还8000K真的不能释放了么?

#4


你平常感觉到缺少这块内存吗?

这块内存其实不值几毛钱,只是一些自认为c语言学得好的人比不过别人编程和程序部署的效率只好比这个。

#5


引用 4 楼 sp1234 的回复:
你平常感觉到缺少这块内存吗?

这块内存其实不值几毛钱,只是一些自认为c语言学得好的人比不过别人编程和程序部署的效率只好比这个。


晕,资源释放完整些不好吗?我没那意思...

#6


http://www.w3school.com.cn/xpath/xpath_axes.asp

#7


引用 6 楼 liuyilin999 的回复:
http://www.w3school.com.cn/xpath/xpath_axes.asp


?

#8


你的这部分内存恐怕没办法完全回收的,你的程序要运行是要依托.Net Framework的,这个东西也是要占用内存的。

#9


不见得一定是你的问题,尽管你把类里面的控件全部Dispose了,但这只意味着它们占用的内存允许被回收,而不意味着一定立即被回收,注意2楼那句"在垃圾回收器认为合适的时候回收"。

销毁自定义类时只要保证把其中能dispose的对象都dispose了,把自定义的数组等都erase了就算完成了自己的任务,至于这些内存何时释放、那些对象本身是否存在内存泄露,就不是你能准确把握的了

#10


所谓“疑人不用、用人不疑”。
你既然不相信 .NET 能帮你回收好内存,必须你自己关注这个问题的话,
你就应该放弃 .NET ,还是去用 C\C++, 那个就能如你所愿,释放内存立刻就能看到了。

#11


选择了.net就应该考虑到内存的占用量,否则用汇编用C

#1


不仅仅是Dispose那么简单
首先在你的类首次实例化时,有没有考虑到从托管代码编译到本地代码的过程
释放的只是对象,但用到过的托管代码会缓存起来,使以后加载更快
想完全回收“18000K”不太可能
当然这只是一方面

#2


本帖最后由 wuyazhe 于 2010-08-30 11:10:26 编辑
你还为这个纠结呢。
内存会在垃圾回收器认为合适的时候回收,如果你认为某个操作不是频繁发生的,可以调用
GC.Collect()
GC.WaitForFullGCComplete()

比如关闭窗体后,执行以上代码。

#3


郁闷,用IDispose不但没释放资源,还增加了几十K...加个GC.Collect就释放了,还是自己写Dispose算了,把一些变量设为Nothing还剩下10000K了,还8000K真的不能释放了么?

#4


你平常感觉到缺少这块内存吗?

这块内存其实不值几毛钱,只是一些自认为c语言学得好的人比不过别人编程和程序部署的效率只好比这个。

#5


引用 4 楼 sp1234 的回复:
你平常感觉到缺少这块内存吗?

这块内存其实不值几毛钱,只是一些自认为c语言学得好的人比不过别人编程和程序部署的效率只好比这个。


晕,资源释放完整些不好吗?我没那意思...

#6


http://www.w3school.com.cn/xpath/xpath_axes.asp

#7


引用 6 楼 liuyilin999 的回复:
http://www.w3school.com.cn/xpath/xpath_axes.asp


?

#8


你的这部分内存恐怕没办法完全回收的,你的程序要运行是要依托.Net Framework的,这个东西也是要占用内存的。

#9


不见得一定是你的问题,尽管你把类里面的控件全部Dispose了,但这只意味着它们占用的内存允许被回收,而不意味着一定立即被回收,注意2楼那句"在垃圾回收器认为合适的时候回收"。

销毁自定义类时只要保证把其中能dispose的对象都dispose了,把自定义的数组等都erase了就算完成了自己的任务,至于这些内存何时释放、那些对象本身是否存在内存泄露,就不是你能准确把握的了

#10


所谓“疑人不用、用人不疑”。
你既然不相信 .NET 能帮你回收好内存,必须你自己关注这个问题的话,
你就应该放弃 .NET ,还是去用 C\C++, 那个就能如你所愿,释放内存立刻就能看到了。

#11


选择了.net就应该考虑到内存的占用量,否则用汇编用C