【问题标题】:When will the garbage collector collect a Singleton? [duplicate]垃圾收集器何时会收集单例? [复制]
【发布时间】:2013-08-19 12:37:20
【问题描述】:

我有一些 C# 中的 SomeSingleton 类(如果重要的话是 .NET 3.5)和代码:

foo()
{
    ...
    SomeSingleton.Instance.DoSomething();
    ...
}

我的问题是:Garbage Collector 什么时候会收集这个 Singleton 对象?

ps:SomeSingleton 的代码:

    private static SomeSingleton s_Instance = null;
    public static SomeSingleton Instance
    {
        get 
        {
            if (s_Instance == null)
            {
                lock (s_InstanceLock)
                {
                    if (s_Instance == null)
                    {
                        s_Instance = new SomeSingleton();
                    }
                }
            }
            return s_Instance;
        }
    }

感谢您的帮助!

编辑(附解释):

在 Widnows 服务中我有代码:

   ...
   FirstSingleton.Instance.DoSomething();
   ...

public class FirstSingleton
{
    (Instance part the same as in SomeSingleton)
    public void DoSomething()
    {
        SomeSingleton.Instance.DoSomething();
    }
}

我想要实现的目标: 我不关心 FirstSingleton 会发生什么,但是 SomeSingleton 会在第一次使用它时启动 Timer,所以只要我的服务正在运行,我就需要 SomeSingleton 存在(因此计时器可以在每个时间段运行新线程)。

据我所知,所有这些都会发生,因为对我的 FirstSingleton 和 SomeSingleton 的引用是静态的,在服务停止之前,GC 不会收集单例,对吗? :)

【问题讨论】:

  • 我相信它是在应用程序终止时(以及其他静态数据)(假设没有删除引用)
  • 除非您将s_Instance 设置为null 并且您没有任何其他相同的引用,否则它永远不会被垃圾收集
  • 就您的代码而言:从不。这对你来说应该无关紧要。当您担心 Dispose (!= collect) 时,请询问。
  • 这已经在stackoverflow.com/a/538238/1856345 得到了非常完美的回答,它包含您需要了解的关于 GC 和 Idisposable 接口的所有信息,如何在托管和非托管资源中使用编辑:但回答您的问题,没有 GC不会释放静态字段
  • 这个问题不是关于IDisposable,而是关于静态字段何时可以被收集。

标签: c# .net garbage-collection singleton


【解决方案1】:

这个问题可以通过这个来回答:Do static members ever get garbage collected?

基本上,当包含的 AppDomain 被销毁时,实例将被销毁。

【讨论】:

    【解决方案2】:

    静态变量引用的对象只有在相关的 AppDomain 被垃圾回收时才会被垃圾回收。在客户端应用程序中,通常只有一个 AppDomain 在整个过程中存在。 (一个例外是当应用程序使用插件架构时——不同的插件可能会被加载到不同的 AppDomain 中,而 AppDomain 可能会在以后被卸载。)

    Refer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-06
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      相关资源
      最近更新 更多