在不设置为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??
}
}