垃圾回收GC(Garbage Collection)
托管资源的分配
- CLR在运行时管理着一段内存地址空间(虚拟地址空间,在运行中会映射到物理内存地址中),分为“托管堆”和“栈”两部分。
- 栈一般用于存储值类型数据,它会在方法执行结束后自动销毁其中引用的值类型变量,当数据被存储在堆栈上的时候,只需要简单地在其后进行扩展。当数据失效的时候,只需要将其从堆栈上移除。
- 托管堆用于引用类型的变量存储,是垃圾收集的关键阵地。
- 对于Unity开发而言,GC是Mono运行时提供的垃圾回收机制,而非引擎的,GC所管理的是Mono的托管堆,而Unity的assets内存管理Unity有自己的内存堆。
Unity游戏运行时内存占用分以下几部分:
- Mono堆: C# 代码
- Native堆:资源,unity引擎逻辑,第三方逻辑。
- 库代码:Unity库,第三方库。
这其中Mono堆相关的内存管理,也就是GC机制是我们作为开发者需要密切关注的。
- Mono托管堆的运作原理
通常游戏开发过程中,mono会对托管堆内存进行分配和管理,托管” 的本意是Mono可以自动地改变堆的大小来适应你所需要的内存,并且适时地调用GC(垃圾回收)操作来释放已经不需要的内存,从而降低开发人员在代码内存管理方面的门槛,但同时开发者也自己可以手动调用GC。 GC的主要步骤
- 停止所有需要mono内存分配的线程。
- 遍历所有已用内存,找到那些不再需要使用的内存,并进行标记。
- 释放被标记的内存到空闲内存。
- 重