什么是托管资源,什么是非托管资源

什么是托管资源,什么是非托管资源,第1张

托管资源

由公共语言运行时(CRL)控制的内存资源,系统可以自行分配和回收的资源;例如程序中分配的对象,作用域内的变量等

非托管资源

是CLR不能控制或者管理的部分,例如文件读取,数据库连接,窗口句柄,图标,打印机资源等,必须在调用或使用后,通过 Finalize或Dispose 手动释放.文件读取和数据库连接需要调用Close()方法关闭并释放资源.

注意,不能在析构函数中释放托管资源,因为析构函数是有垃圾回收器调用的,可能在析构函数调用之前,类包含的托管资源已经被回收了,从而导致无法预知的结果。

GC垃圾回收器

当系统内存资源匮乏时,它就会被激发,然后自动的去释放那些没有被使用的托管资源。

工作原理

遍历托管堆中的对象,标记被使用对象(没被使用的就是所谓的垃圾),然后把可达对象转移到一个连续的地址空间(也叫压缩),其余的所有没用的对象内存被回收掉。

GC进行垃圾回收时的主要流程是?

(1)标记 ,找到并创建所有活动对象的列表。

(2)重定位 ,用于更新对将要压缩的对象的引用。

(3)压缩 ,用于回收由死对象占用的空间,并压缩幸存的对象。 压缩阶段将垃圾回收中幸存下来的对象移至段中时间较早的一端。

GC在哪些情况下回进行回收工作?

(1)系统具有低的物理内存。 这是通过 OS 的内存不足通知或主机指示的内存不足检测出来。

(2)由托管堆上已分配的对象使用的内存超出了可接受的阈值。 随着进程的运行,此阈值会不断地进行调整。

(3)调用 GC.Collect 方法。 几乎在所有情况下,你都不必调用此方法,因为垃圾回收器会持续运行。 此方法主要用于特殊情况和测试。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/722447.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存