重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1.如果你释放的是托管托管代码的内存,那么托管代码的内存管理是自动的,.NET可以保证我们的托管程序在结束时全部释放。
在新疆等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站设计、成都做网站 网站设计制作按需规划网站,公司网站建设,企业网站建设,成都品牌网站建设,成都全网营销推广,成都外贸网站制作,新疆网站建设费用合理。
2.如果是非托管资源时.NET就不能自动管理了,下面是释放非托管资源内存方法
当我们利用如数据库、文件等非托管资源时,就要用到.NET Framework中的标准: IDisposable接口。按照标准,所有有需要手动释放非托管资源的类都得实现此接口。这个接口只有一个方法,Dispose(),不过有相对的 Guidelines指示如何实现此接口,在这里我向大家说一说。实现IDisposable这个接口的类需要有这样的结构:
[Visual Basic]
Public Class Base
Implements IDisposable
Public Overloads Sub Dispose() Implements IDisposable.Dispose
Me.Dispose(True)
GC.SuppressFinalize(Me)
End Sub
Protected Overloads Overridable Sub Dispose(ByVal disposing As Boolean)
If disposing Then
' 托管类
End If
' 非托管资源释放
End Sub
Protected Overrides Sub Finalize()
Me.Dispose(False)
MyBase.Finalize()
End Sub
End Class
Public Class Derive
Inherits Base
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
' 托管类
End If
' 非托管资源释放
MyBase.Dispose(disposing)
End Sub
End Class
我们要实现Dispose方法,实现这个Dispose方法的几个准则:
它不能扔出任何错误,重复的调用也不能扔出错误。也就是说,如果我已经调用了一个对象的Dispose,当我第二次调用Dispose的时候程序不应该出错,简单地说程序在第二次调用Dispose时不会做任何事。这些可以通过一个flag或多重if判断实现。
一个对象的Dispose要做到释放这个对象的所有资源。拿一个继承类为例,继承类中用到了非托管资源所以它实现了IDisposable接口,如果继承类的基类也用到了非托管资源那么基类也得被释放,基类的资源如何在继承类中释放呢?当然是通过一个virtual/Overridable方法了,这样我们能保证每个Dispose都被调用到。这就是为什么我们的设计有一个virtual/Overridable的Dispose方法。注意我们首先要释放继承类的资源然后再释放基类的资源。
因为非托管资源一定要被保障正确释放所以我们要定义一个Finalizer来避免程序员忘了调用Dispose的情况。上面的设计就采用了这种形式。如果我们手动调用Dispose方法就没有必要再保留Finalizer了,所以在Dispose中我们用了GC.SupressFinalize 将对象从Finalizer表去掉,这样再回收时速度会更快。
那么那个disposing和"托管类"是怎么回事呢?是这样:在"托管类"中写所有你想在调用Dispose时让其处于可释放状态的托管代码。还记得我们说过我们不知道托管代码是什么时候释放的吗?在这里我们只是去掉成员对象的引用让它处于可被回收状态,并不是直接释放内存。在"托管类"中这里我们也要写上所有实现了IDisposable的成员对象,因为他们也有Dispose,所以也需要在对象的Dispose中调用他们的 Dispose,这样才能保证第二个准则。disposing是为了区分Dispose的调用方法,如果我们手动调用那么为了第二个准则"托管类"部分当然得执行,但如果是Finalizer调用的Dispose,这时候对象已经没有任何引用,也就是说对象的成员自然也就不存在了(无引用),也就没有必要执行"托管类"部分了,因为他们已经处于可被回收状态了。好了,这就是IDisposable接口的全部了。现在让我们来回想一下,以前我们可能认为有了 Dispose内存就会马上被释放,这是错误的。只有非托管内存才会被马上释放,托管内存的释放由GC管理,我们不用管。
一般.net的垃圾回收机制会在过程结束后进行垃圾回收,但是垃圾回收是比较消耗系统资源的,所以不可能经常被调用。
如果你需要强制进行垃圾回收,可在过程最后添加如下代码:
GC.Collect()
强制进行垃圾回收
.NET目前的垃圾回收机制不能实现把对象真正的立即释放掉,GC会对垃圾进行管理,如果垃圾没有引用计数了,就会被回收。
编码的时候能用托管类尽量用托管类去实现你的功能,
对于实现了IDisposable接口的类,用完了记得调用close或者Dispose又或者相应的方法去释放资源,最好吧使用using语句块;
对于Com对象,用完了先关闭,然后调用Runtime.InteropServices.Marshal.FinalReleaseComObject()方法把Com对象的引用计数设置为0。当 COM 对象的引用计数变为 0 时,通常会释放 COM 对象,不过这取决于 COM
对象的实现,而不是运行时可以控制的。最后调用ComObj = Nothing以释放ComObj持有的引用。不过要注意,只有当ComObj的生存期相对于垃圾回收器用于检测孤立对象的时间来说很长时,你才应该将变量设置为 Nothing。
有部分来自MSDN
可以将文件等分成两部分,分别用两个private读取就是2线程。
内存解决方案:不要等程序自动GC,自己手动释放不需要内存。
缺陷:可能会浪费时间。
如果一个程序要用Application.exit来退出,那说明太失败了。。。
一般来说,都是用close关闭就可以了。
用.NET平台开发,只要你在操作数据库或者IO的时候没有忘记关闭资源连接,一般是不需要你手动释放的。
1、可能进入了死循环,仔细检查代码有无这种情况。
2、无用的数据一直在累积而没有及时销毁,导致内存占用越来越大,最终崩溃。要注意对象随用随清,及时 Dispose 掉或调用 GC.Collect。