在 .NET Core 中如果一个对象通过成员变量引用了自己(代码如下),这个对象是否会被 GC 正常回收?
public class EnterpriseUserService : IEnterpriseUserService { private readonly IEnterpriseUserService _enterpriseUserService; public EnterpriseUserService() { _enterpriseUserService = this; } }
tldr: 能够正常 GC
根据这篇文档,GC 在 Mark Phase 会从当前应用程序的栈、特定的集合句柄(我猜是 WeakReference 之类的东西)以及静态对象开始进行递归的标记,相关的代码可以在 coreclr 中找到:https://github.com/dotnet/coreclr/blob/master/src/gc/gc.cpp#L20090
也就是说,不管是自身引用还是循环引用,只要无法从 GC 的查找起点到达,就不会被标记为存活的对象