Unity IL2Cpp的GC原理主要包括以下几点:
垃圾回收的基本概念:
- 垃圾回收是指在游戏运行时,将废弃数据所占用的内存重新回收,以供再次使用的过程。
- GC触发会导致游戏卡顿和内存碎片导致的堆内存过大问题。
Unity托管堆的管理:
- Unity托管堆由Mono或IL2CPP运行时自动管理,用于分配托管代码中创建的所有对象。
- GC定期运行,扫描堆上的所有对象,标记并删除不再引用的对象,释放内存。
- Unity的垃圾收集机制是非分代的且非压缩的,意味着GC必须扫描整个堆,导致性能随堆扩展而下降。
il2cpp版本的BoehmGC:
- Unity现在使用的GC机制是il2cpp版本的BoehmGC,这是一种保守的垃圾回收器,用于C/C++程序中,支持多个操作系统和平台。
- BoehmGC通过第三方库BoehmGC.cpp进行调用,基于标记清扫机制运行。
BoehmGC的运行机制:
- 标记清扫机制:BoehmGC算法分四个阶段运行,标记并清扫不再引用的对象。
- 渐进式GC:为了减轻频繁GC带来的卡顿,Unity采用渐进式GC,将GC工作拆分到多个帧中处理。
- 内存管理:包括小内存对象和大内存对象的分配。小内存对象按16字节基本单位分配,大内存对象则向上取整到4K的倍数大小。
内存分配策略:
- 分级结构:分配器使用分级结构,将内存申请分为小内存对象和大内存对象。
- 空闲链表和内存池:分配器维护空闲链表和底层内存池,用于管理内存块的分配和释放。小内存对象从空闲链表中分配,大内存对象则从内存池中寻找合适的内存块进行拆分或合并。
总结:Unity IL2Cpp的GC原理基于BoehmGC算法,通过标记清扫机制管理内存,并采用渐进式GC减轻卡顿。内存分配策略包括小内存对象和大内存对象的分级管理,以及空闲链表和内存池的使用。这些机制共同确保Unity游戏在运行时能够高效地管理内存。