用户的应用程序创建的大多数对象,可以依靠 .NET Framework 的垃圾回收器隐式地执行所有必要的内存管理任务。但是,在用户创建封装非托管资源的对象时,使用完这些非托管资源之后,必须显式地释放它们。最常见的一类非托管资源就是包装操作系统资源的对象,例如文件、窗口或网络连接。虽然垃圾回收器可以跟踪封装非托管资源的对象的生存期,但它不了解具体如何清理这些资源。对于这些类型的对象,.NET Framework 提供 Object.Finalize 方法,它允许对象在垃圾回收器回收该对象使用的内存时适当清理其非托管资源。默认情况下,Finalize 方法不执行任何操作。如果您要让垃圾回收器在回收对象的内存之前对对象执行清理操作,您必须在类中重写 Finalize 方法。
当创建或使用封装非托管资源的对象时,您应该特别注意使用 Dispose 方法。实现公共的 Dispose 或 Close 方法,这两个方法执行必要的对象清理代码。
当创建或使用封装非托管资源的对象时,您应该特别注意使用 Dispose 方法。实现公共的 Dispose 或 Close 方法,这两个方法执行必要的对象清理代码。
程序结束掉以后内存没有释放 这种现象在.net上应该是正常的,因为对象回收是由专门的垃圾回收器GC来做的,而GC是根据一定的算法来调度对象回收的,一般来说不会对象不用了就即时回收的,通常会有延迟的。
当然,有些资源没有被GC回收是有可能的,一般这些资源都是非托管资源(如文件,数据库连接)或者是写在非安全代码块里unsafe.
顺便说一句,微软一向标榜.net是安全的。
如果程序完全结束了,它的内存会完整地被操作系统回收。
你是如何观察到仍有一部分内存没有被释放掉的?
所以楼主所观察到的东西未必和.net有关。你的那个察看内存占用的软件在某些地方的算法可能有问题,比如一块内存用完了,但是系统未必会马上把它清除或者交换出去。