美文网首页
内存管理之垃圾回收

内存管理之垃圾回收

作者: APP4x | 来源:发表于2020-11-19 19:18 被阅读0次
    这是我在《Unity游戏优化 (第2版)》看的,记录一下~

    垃圾回收是啥?
    重要工作就是 确保不使用比所需要的更多的托管堆内存,而不再需要的内存会自动回收

    比如创建一个GameObject,接着销毁他,那么GC将标记该GameObject使用的内存空间,以便以后回收
    GC不会立即回收,只在有需要的时候回收

    当请求使用新的内存空间,托管的堆内存中有足够的空间空间以满足该请求时,GC只简单的分配新的空间并交给调用者
    如果没有足够空间,那GC就开始扫描所有已存在并且不再使用的内存分配并清除他们
    (GC一般作为扩展堆空间的最后手段)


    Unity使用的Mono版本中的GC:
    是一种追踪式GC,它使用标记与清除策略

    其算法分为几个阶段:
    1.创建对象时,为每个分配的对象通过一个额外的数据位追踪,标识对象是否被标记(false为未标记)
    2.收集过程时,通过设置对象的标识为true,标记所有依然对程序可访问的对象
    可访问对象要么是直接引用(栈上的静态或本地变量),要么通过其他直接或间接可访问对象的字段(成员变量)来间接引用(本质上收集一系列依然被程序引用的对象)
    3.如果对象被标记,那么在某处依然引用它,GC将无视他。如果没有被标记,那么它将要被回收。
    该阶段所有标记的对象都将被跳过,但在下次垃圾回收扫描之前会将它设置回false
    (GC在内存中维护所有对象的列表,而引用程序维护一个独立的列表,仅包含gc维护的一部分)

    当没有被标记的对象被回收释放空间后,重新访问创建对象的初始请求。
    a.如果GC已经为对象释放了足够的空间,就会分配内存并返回给调用者
    b.如果空间不够,就只能向操作系统请求以扩展托管堆

    最终可以分配内存空间并返回给调用者

    相关文章

      网友评论

          本文标题:内存管理之垃圾回收

          本文链接:https://www.haomeiwen.com/subject/qkvliktx.html