非静态类和垃圾回收中引用类型的静态成员

时间:2019-01-29 18:02:39

标签: c# garbage-collection static-members

在不设置为null的情况下,非静态类内的引用类型的静态成员可能会影响垃圾回收吗?


引用类型的静态成员的作用: specialManagerSingletonRef
非静态类的作用: SpecialProperty

让我们假设以下内容(让我们举个例子吧!):

  • 我们已经创建并初始化了6万个 SpecialProperty 实例(下面的 SpecialProperty 代码)

  • 每个 SpecialProperty 都需要 SpecialManagerSingleton (现在要从DI容器)

  • 我们有三个对象: ObjectA ObjectB ObjectC 每个都有2万个特殊属性

  • 在某个时间点,全部三个: ObjectA ObjectB < em> ObjectC 用于销毁,在应用程序中不再需要,然后每个调用Dispose()来实现IDisposable接口。调用Dispose()时,其持有的SpecialProperties的集合将被清除(因此从现在开始,没有人会引用这6万个SpecialProperty中的任何一个)

即使 specialManagerSingletonRef 不会设置为null,这60000个SpecialProperties是否也会尽快被垃圾回收?

我不确定保存对 SpecialManagerSingleton 的引用的静态成员如何影响垃圾回收,因为从逻辑上告诉我,每个引用了其他对象的对象都不会被垃圾回收且不会为空 specialManagerSingletonRef 可能会导致内存泄漏,然后(或者至少要等到单例的类加载器有资格进行收集,在这种情况下,这是在应用程序关闭时!)。也许GC将以不同的方式对待这种情况?

参考此static-members-inside-non-static-classes-and-garbage-collection-所有6万个特殊属性都将被垃圾回收。

    public class SpecialProperty : IDisposable
    {

     /** Is this member going to block gc from collecting, SpecialProperty 
         if we won't set it to null? **/
    private static SpecialManagerSingleton specialManagerSingletonRef; 
    private IUnityContainer container;

    public SpecialProperty(IUnityContainer container)
    {
        this.container = container;
    }

    public SpecialManagerSingleton SpecialManager
    {
        get
        {
            if (specialManagerSingletonRef == null)
            {
                specialManagerSingletonRef = container.Resolve<SpecialManagerSingleton>();
            }

            return specialManagerSingletonRef;*emphasized text*
        }
    }

    public void Dispose()
    {

        //do i need to set specialManagerSingletonRef to null to get this SpecialProperty instance garbage collected??

    }
}

0 个答案:

没有答案