Статический член ссылочного типа внутри нестатического класса и сборки мусора - PullRequest
0 голосов
/ 29 января 2019

Может ли статический член ссылочного типа внутри нестатического класса влиять на сборку мусора, если для него не задано значение NULL?


Играет роль статического члена ссылочного типа: specialManagerSingletonRef
Играя роль нестатического класса: SpecialProperty

Давайте предположим следующее (давайте рассмотрим пример!):

  • У нас есть 60 000 экземпляров SpecialProperty , созданных и инициализированных (код SpecialProperty ниже)

  • Каждый SpecialProperty требует SpecialManagerSingleton (и сейчас эторазрешение его из контейнера DI)

  • У нас есть три объекта: ObjectA , ObjectB , ObjectC каждый имеет коллекцию по 20 000 SpecialProperties

  • В какой-то момент времени все three: Объект A , Объект B , Объект C предназначены для уничтожения и не предназначенынужно больше в приложении, а затем каждый вызывает Dispose (), поскольку они реализуют интерфейс IDisposable.Когда вызывается Dispose (), их коллекции, в которых хранятся SpecialProperties, очищаются (и с этого момента никто не ссылается ни на одно из этих 60 000 SpecialProperties)

Являются ли они60 000 SpecialProperties будут собираться как можно быстрее, даже если specialManagerSingletonRef не будет иметь значение null?

Я не уверен, как этот статический член, который содержит ссылку на SpecialManagerSingleton , может влиять на сборку мусора, так как из того, что логика подсказывает мне, каждый объект, имеющий ссылку на другое, не будет собираться ибез обнуления specialManagerSingletonRef у нас может быть утечка памяти, тогда (или по крайней мере до тех пор, пока загрузчик классов синглтона не будет иметь право на сбор, который в этом случае будет происходить во время закрытия приложения!). Номожет быть, GC будет трактовать этот сценарий по-другому?

Ссылаясь на эту static-members-inside-non-static-classes-and-garbage-collection - все 60 000 SpecialPropertys будут мусоромсобрано.

    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??

    }
}
...