由公共语言运行时(CRL)控制的内存资源,系统可以自行分配和回收的资源;例如程序中分配的对象,作用域内的变量等
非托管资源是CLR不能控制或者管理的部分,例如文件读取,数据库连接,窗口句柄,图标,打印机资源等,必须在调用或使用后,通过 Finalize或Dispose 手动释放.文件读取和数据库连接需要调用Close()方法关闭并释放资源.
注意,不能在析构函数中释放托管资源,因为析构函数是有垃圾回收器调用的,可能在析构函数调用之前,类包含的托管资源已经被回收了,从而导致无法预知的结果。
GC垃圾回收器当系统内存资源匮乏时,它就会被激发,然后自动的去释放那些没有被使用的托管资源。
工作原理遍历托管堆中的对象,标记被使用对象(没被使用的就是所谓的垃圾),然后把可达对象转移到一个连续的地址空间(也叫压缩),其余的所有没用的对象内存被回收掉。
GC进行垃圾回收时的主要流程是?(1)标记 ,找到并创建所有活动对象的列表。
(2)重定位 ,用于更新对将要压缩的对象的引用。
(3)压缩 ,用于回收由死对象占用的空间,并压缩幸存的对象。 压缩阶段将垃圾回收中幸存下来的对象移至段中时间较早的一端。
GC在哪些情况下回进行回收工作?(1)系统具有低的物理内存。 这是通过 OS 的内存不足通知或主机指示的内存不足检测出来。
(2)由托管堆上已分配的对象使用的内存超出了可接受的阈值。 随着进程的运行,此阈值会不断地进行调整。
(3)调用 GC.Collect 方法。 几乎在所有情况下,你都不必调用此方法,因为垃圾回收器会持续运行。 此方法主要用于特殊情况和测试。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)