认识UE GC

垃圾回收在UObject无引用时自动回收内存。GC从根节点开始搜索,标记未引用或PendingKill的UObject为垃圾。防止回收可通过AddToRoot、AddReference等方法保持引用。MarkPendingKill标记对象可回收,ConditionalBeginDestroy允许立即释放资源。GC包括标记对象不可达和清扫回收两个阶段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

垃圾回收

当一个UObject被认为无用时,则它的内存空间会被自动回收,无用指的是不被其它对象所引用。

时间段

垃圾回收器定时或某些阶段(如:LoadMap、内存较低等)从根节点Root对象开始搜索,从而追踪所有被引用的对象。当UObject对象没有直接或间接被根节点Root对象引用或被设置为PendingKill状态,就被GC标记成垃圾,并最终被GC回收。

防止UObject对象被垃圾回收

关键就是让GC能够查询到此UObject,形成引用链网络

  • By self: this->AddToRoot
  • By Quoter:
    • UObject:
      • 加UPROPERTY宏修饰
      • 重载AddReferencedObjects()->AddReference
    • 非UObject:
      1. 继承FGCObject
      2. 重载AddReferencedObjects()->AddReference

标记UObject对象可回收

  • Root: RemoveFromRoot()->MarkPendingKill()
  • 非Root: MarkPendingKill()
  • 手动回收: ConditionalBeginDestroy, 马上释放资源不用等GC, 但跳过了GC Mark所有过程,也就没有自动更新引用(可能出现野指针)。

GC阶段

  1. 标记阶段(GC Mark)
    1. 标记对象为不可达:将对象设置上EInternalObjectFlags::Unreachable标记,此时调用IsUnreachable函数才会返回true
    2. 自动更新引用: 将UObject* 成员变量自动清空为nullptr,以防止出现野指针。(处于引用链网的UObject*才会置空)
  2. 清扫阶段(GC Sweep):阶段遍历所有对象,将标记为不可达的对象回收。该阶段可通过限制时间来分帧异步进行,避免导致卡顿

参考:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MustardJim

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值