Unity的垃圾回收——内存相关技术

澜莓

参考资料1 参考资料2 参考资料3 参考资料4

引子

垃圾回收(Garbage Collection)

在公共语言运行时 (CLR) 中,垃圾回收器 (GC) 用作自动内存管理器。 垃圾回收器管理应用程序的内存分配和释放。垃圾(Garbage)是存储无用数据的内存的术语,GC(Garbage Collection 垃圾回收)是使这些内存可以再次使用的过程。 GC是Unity管理内存的一部分,游戏可能因为GC负担过重而表现不佳(帧率过低、剧烈波动或甚至卡顿),所以GC是引起性能问题的一个常见原因。

物理内存和虚拟内存

物理内存是计算机系统中实际可用的内存,由硬件直接管理。
虚拟内存是抽象概念,通过硬盘空间来模拟物理内存,以扩展可用的内存空间

如果计算机缺少运行程序操作所需的RAM空间,则虚拟内存将数据从RAM移动到虚拟内存(分页文件)空间。

虚拟内存的访问速度比物理内存要慢,因为访问RAM比访问硬盘快得多。

虚拟内存不是虚拟地址空间

虚拟内存是一种内存管理技术,它允许进程使用比实际物理内存更多的内存空间。
虚拟内存的实现依赖于虚拟地址空间和物理地址空间之间的映射机制
当进程访问虚拟地址时,如果对应的物理页面不在物理内存中, 操作系统会从磁盘中读取数据到物理内存中,然后更新页表或段表,使得进程可以继续访问该虚拟地址。

物理地址空间是计算机硬件实际可用的内存范围,大小受到计算机配置影响。
虚拟地址空间是操作系统为每个进程分配的一块地址空间(譬如默认情况下,32位的每个进程享有2GB)。
在这个空间中,进程可以自由地分配和使用内存,而不需要关心这些内存实际上映射到物理内存的哪个位置。

每个进程都有自己单独的虚拟地址空间,同一计算机的所有进程共享相同的物理内存和页文件

进程的虚拟地址空间可以分为以下几个区域

页表和段表是管理虚拟和物理地址空间映射的数据结构

页表(Page Table)

段表(Segment Table)和页表有许多相似之处,可以自行查询,本文不再赘述。

进程的内存处理就像做菜

市谷有咲她奶奶(可执行文件)需要做两道菜(进程),但流星堂现在只有一口锅(物理地址空间)。
奶奶决定先做第一道菜,把食材(数据)从冰箱(虚拟地址空间)取出,然后根据页表或段表(地址转换)把材料名(虚拟地址)转换为菜名(物理地址)。
一旦材料名被转换为菜名,一旁帮忙的市谷有咲(操作系统)就可以通过菜名(物理地址)接触食材(数据)。
因为市谷有咲不能直接通过材料名(虚拟地址)确认食材(访问数据)
如果食材本来就在锅里(物理内存),那么市谷有咲就可以直接处理食材;但是如果在别的地方(磁盘),就需要通过上述的地址转换搬到锅里(页面置换)。
做完了第一道菜后,市谷有咲(操作系统)需要把锅里不用的食材(内存碎片)清理干净,为下一道菜(进程)做准备。
具体的方法便是垃圾回收(GC),把材料放回冰箱(释放内存)。