unity GC机制
— 敖立鑫
unity 会自动内存管理
参考:Unity GC垃圾回收
unity 内存管理池
垃圾回收主要指的是堆内存分配和回收
- 堆栈内存
- 较小,短暂数据
- 值类型数据
- 内存回收迅速
- 堆内存
- 较大,存储时间较长
- 引用类型
- 内存回收不及时
堆内存分配
- 有空间,直接分配空间
- 没有,先触发GC,回收之后空间足够就分配
- 如果还不够,则会扩展堆内存的大小,然后分配内存
- 堆内存的分配有可能会变得十分缓慢,特别是在需要垃圾回收和堆内存需要扩展的情况下,通常需要减少这样的操作次数。
堆内存回收(GC)
当堆内存上一个变量不再处于激活状态的时候,其所占用的内存并不会立刻被回收,不再使用的内存只会在GC的时候才会被回收。其操作如下
- GC会检查堆内存上的每个存储变量;
- 对每个变量会检测其引用是否处于激活状态;
- 如果变量的引用不再处于激活状态,则会被标记为可回收;
- 被标记的变量会被移除,其所占有的内存会被回收到堆内存上。
GC操作是一个极其耗费的操作,堆内存上的变量或者引用越多则其运行的操作会更多,耗费的时间越长。
## GC触发时机:
主要有三个操作会触发垃圾回收:
- 堆内存不够时候
- GC会自动的触发,不同平台运行频率不一样;
- GC可以被强制执行。
特别是在堆内存上进行内存分配时内存单元不足够的时候,GC会被频繁触发,这就意味着频繁在堆内存上进行内存分配和回收会触发频繁的GC操作。
GC操作带来的问题:
- 耗时,影响性能。
- 其次GC可能会在关键时候运行,影响游戏帧率
- 堆内存的碎片划。当一个内存单元从堆内存上分配出来,其大小取决于其存储的变量的大小。当该内存被回收到堆内存上的时候,有可能使得堆内存被分割成碎片化的单元。也就是说堆内存总体可以使用的内存单元较大,但是单独的内存单元较小,在下次内存分配的时候不能找到合适大小的存储单元,这也会触发GC操作或者堆内存扩展操作
降低GC
- 1.减少GC的运行次数
- 减少单次GC的运行时间
- .将GC的运行时间延迟,避免在关键时候触发,比如可以在场景加载的时候调用GC