【问题标题】:Singleton injected into a class - does it cause memory leak?注入类的单例 - 它会导致内存泄漏吗?
【发布时间】:2014-08-26 08:39:19
【问题描述】:

我有一个 MyClass 类,它在构造函数 (DI) 中有一个 MyThreadPool 类型的参数。

MyThreadPool 是一个单例。代码如下:

Public Class MyClass
    Private _threadPool as MyThreadPool

    Public Sub New(threadPool as MyThreadPool)
        _threadPool = threadPool
    End Sub
End Class

在 MyClass 的私有字段 (_threadPool) 中保存单例 MyThreadPool 是否会导致 MyClass 的任何实例留在内存中并且变得不可被 GC 收集?

【问题讨论】:

    标签: .net vb.net memory-leaks singleton


    【解决方案1】:

    不,因为引用来自MyClass的实例MyThreadPool的实例。这意味着MyClass 的实例将使MyThreadPool 的实例保持活动状态,但反之则不然。 MyThreadPool 的实例没有对MyClass 的实例的引用,所以它不能保持存活。

    想想垃圾收集器遵循引用,探索它可以到达的每个对象。如果没有引用 MyClass 的实例,则它有资格进行垃圾收集。你不能从MyThreadPool“得到”MyClass的实例,所以没关系。

    【讨论】:

    • 感谢 Jon... 一个相关的问题是,如果 MyClass 有一个由单例中定义的事件处理程序(全局应用程序级事件处理程序)处理的事件,它不会导致内存泄漏,对吧?
    • @SamuelC:没错。但同样,反过来也会有问题 - 订阅由单例(或静态事件)声明的事件可能会导致泄漏。
    猜你喜欢
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 2021-09-25
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多