unity GC机制

— 敖立鑫

unity 会自动内存管理

参考:Unity GC垃圾回收

unity 内存管理池

垃圾回收主要指的是堆内存分配和回收

  • 堆栈内存
    • 较小,短暂数据
    • 值类型数据
    • 内存回收迅速
  • 堆内存
    • 较大,存储时间较长
    • 引用类型
    • 内存回收不及时

堆内存分配

  1. 有空间,直接分配空间
  2. 没有,先触发GC,回收之后空间足够就分配
  3. 如果还不够,则会扩展堆内存的大小,然后分配内存
  4. 堆内存的分配有可能会变得十分缓慢,特别是在需要垃圾回收和堆内存需要扩展的情况下,通常需要减少这样的操作次数。

堆内存回收(GC)

当堆内存上一个变量不再处于激活状态的时候,其所占用的内存并不会立刻被回收,不再使用的内存只会在GC的时候才会被回收。其操作如下

  1. GC会检查堆内存上的每个存储变量;
  2. 对每个变量会检测其引用是否处于激活状态;
  3. 如果变量的引用不再处于激活状态,则会被标记为可回收;
  4. 被标记的变量会被移除,其所占有的内存会被回收到堆内存上。

GC操作是一个极其耗费的操作,堆内存上的变量或者引用越多则其运行的操作会更多,耗费的时间越长。

## GC触发时机:

主要有三个操作会触发垃圾回收:

  • 堆内存不够时候
  • GC会自动的触发,不同平台运行频率不一样;
  • GC可以被强制执行。

特别是在堆内存上进行内存分配时内存单元不足够的时候,GC会被频繁触发,这就意味着频繁在堆内存上进行内存分配和回收会触发频繁的GC操作。

GC操作带来的问题:

  • 耗时,影响性能。
  • 其次GC可能会在关键时候运行,影响游戏帧率
  • 堆内存的碎片划。当一个内存单元从堆内存上分配出来,其大小取决于其存储的变量的大小。当该内存被回收到堆内存上的时候,有可能使得堆内存被分割成碎片化的单元。也就是说堆内存总体可以使用的内存单元较大,但是单独的内存单元较小,在下次内存分配的时候不能找到合适大小的存储单元,这也会触发GC操作或者堆内存扩展操作

降低GC

  • 1.减少GC的运行次数
  • 减少单次GC的运行时间
  • .将GC的运行时间延迟,避免在关键时候触发,比如可以在场景加载的时候调用GC

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注