1..NET 中超过80%都是托管资源(非托管资源为插件,或其他类库)
2.。NET GC机制
(1) 并不能释放所有资源,他不能释放非托管资源
(2)GC并不是实时性的 者将会造成系统性能上的瓶颈和不确定性(所以有了IDisposable接口,内包含Dispose方法,使用这个方法可以释放非托管资源,使用using简化资源管理)
3. GC.Collect()强制经行垃圾回收 GC.colIlect (int 32)强制经行0代到指定代垃圾回收
GC Collect(int 32,GCCollectionMade)强制指定时间经行0代到指定代垃级回收。
4.GC注意事项:
(1)只管理内存
(2)在独立的线程中运行 去删除不在引用的内存
(3)每次运行压缩托管堆
(4)必须对非托管资源进行释放 可以通过定义Finalizer来保证资源释放
(5) Finalizer在对象不被应用的某个不确定时间内执行
5.GC算法
(1)压缩算法 挂起线程->找到root节点->拿到对象图->标记(未标记的是要进行回收的垃圾-回收掉为被标记的垃圾-)->堆压缩->修复指针(压缩后堆索引到栈的内存地址发生变化,需要将指针指到正确的位置)
(2)分代算法
条件:1大量的短期的生命周期的对象创建(例如局部变量 ) 较老的生命周期的对象例如全局的对象会或者静态的
2 对于大部分的内存回收 要比 全部的进行垃圾回收的操作快(有些生命周期长的对象不需要每次都对其进行判断是否需要进行回收)
3 .Net将heap分为三个代龄区域 Gen0 Gen1 Gen2
首先如何Geno区域的内存达到阈值则Gc处理将存活的对象存入 Gen1.
如果Gen1中的内存达到阈值经行GC将存活的对象存入Gen3
他们执行的频率为100: 10: 1.
6判断足否被标记为存活对象算法:
Finalization Queue(完成队列] FreachableQueuel(可达队列)存储的足对象指针,
进性Mark 可分辨出那些是垃圾
通过:NET对象提供的Finalize方法
Finalization Queue 从堆中发现没执行Finalize合将他冲垃级椎里就出来放到可达队列执行Finalize在杀死
Unty内存管理,
自行内存回收,定时堆上回收拉圾
强制垃级回收
堆上内存不够进行内存回收。
Unity Gc在. net上E层UNITY自己又封装了一些算法他去不定时去调。net的Gc.,