原文Optimizing garbage collection in Unity games。这里对这篇文章的粗略翻译,当作自己的笔记。
Garbage Collector在这里被翻译成名词GC。对于Garbage Collection这里翻译成GC内存回收。
内存垃圾: 代码中销毁了(disposed)但是GC还没有清理的内存。
Unity的托管内存的简单介绍
为了理解GC(本文GC指代Garbage Collector)在内存分配和回收时是怎样工作的,我们必须首先了解Unity的引擎代码和我们自己编写的脚本是怎么利用内存来工作的。
Unity引擎代码运行时管理内存的方式叫做手动管理内存(manual memory management)。也就是说引擎代码必须显示的声明内存是怎么使用的。手动管理内存没有用到GC,这部分内容本文不做介绍。
当运行我们自己编写的脚本时Unity管理这部分内存的方式叫做自动内存管理(automatic memory management).这意味这我们自己编写的代码不需要很详细的去告诉Unity怎样去管理这部分内存。Unity都帮我们做好了。
简而言之,Unity的自动管理内存工作方式如下:
- Unity有两个可以访问的内存池:栈(stack)和堆 (heap)(也被叫做托管堆。栈内存被用在短期存储一些小片段的数据,堆则用来存储一些长期并且比较大的片段数据)。
- 当一个变量创建好了,Unity会在栈或者堆中申请一个内存块。
- 只要这个创建的变量在作用范围之内(我们的代码一直可以访问到它),为它分配的相应的那块内存就一直是保持可用状态。我们把这块内存成为已经被分配的(allocated)。我们把在栈中分配内存的变量叫做栈上的对象,把内存分配在堆上的变量成为堆上的对象。
- 当这个变量已经脱离了它的作用区域,相应的这个变量所分配的内存也就不再需要了,这块内存随之就会把返回给分配时的那个内存池。我们称这块内存叫做已回收(deallocated)。栈上的内存一旦离开了作用区域就会立即被回收。如果是堆上的内存即便是它的引用已经超出了作用区域也不会被立即回收,它还会保持它的分配状态。
- GC会标记并且回收堆上没有被使用的内存。它会周期性的对堆上的内存进行清理。
现在我们了解了内存使用的流程,让我们来更深入的来了解栈和堆上的内存的分配和释放。