这是我在《Unity游戏优化 (第2版)》看的,记录一下~
垃圾回收是啥?
重要工作就是 确保不使用比所需要的更多的托管堆内存,而不再需要的内存会自动回收
比如创建一个GameObject,接着销毁他,那么GC将标记该GameObject使用的内存空间,以便以后回收
GC不会立即回收,只在有需要的时候回收
当请求使用新的内存空间,托管的堆内存中有足够的空间空间以满足该请求时,GC只简单的分配新的空间并交给调用者
如果没有足够空间,那GC就开始扫描所有已存在并且不再使用的内存分配并清除他们
(GC一般作为扩展堆空间的最后手段)
Unity使用的Mono版本中的GC:
是一种追踪式GC,它使用标记与清除策略
其算法分为几个阶段:
1.创建对象时,为每个分配的对象通过一个额外的数据位追踪,标识对象是否被标记(false为未标记)
2.收集过程时,通过设置对象的标识为true,标记所有依然对程序可访问的对象
可访问对象要么是直接引用(栈上的静态或本地变量),要么通过其他直接或间接可访问对象的字段(成员变量)来间接引用(本质上收集一系列依然被程序引用的对象)
3.如果对象被标记,那么在某处依然引用它,GC将无视他。如果没有被标记,那么它将要被回收。
该阶段所有标记的对象都将被跳过,但在下次垃圾回收扫描之前会将它设置回false
(GC在内存中维护所有对象的列表,而引用程序维护一个独立的列表,仅包含gc维护的一部分)
当没有被标记的对象被回收释放空间后,重新访问创建对象的初始请求。
a.如果GC已经为对象释放了足够的空间,就会分配内存并返回给调用者
b.如果空间不够,就只能向操作系统请求以扩展托管堆
最终可以分配内存空间并返回给调用者