【问题标题】:Garbage collection for instances within singleton class单例类中实例的垃圾收集
【发布时间】:2013-12-05 20:38:03
【问题描述】:

我有一个单例类,它的实例在我的应用程序的整个生命周期中都是活动的。从其中一个单例实例方法中,我创建了一个可运行线程的实例并执行它。可运行线程实例在执行后会成为垃圾回收的候选对象,还是会因为我的单例实例始终处于活动状态而永远留在堆中?

例如:在下面的示例中,每次调用 MySingleton.getInstance().runMyThread() 时,我都会创建一个 MyRunnable 类的新实例。这些 MyRunnable 实例在 run() 方法完全执行并结束后是否会被考虑进行垃圾收集?

public class MySingleton
{
    private MySingleton instance = null;

    private MySingleton() {}

    public static MySingleton getInstance()
    {
        if(instance == null)
        {
            instance = new MySingleton();
        }
    }  

    public void runMyThread()
    {
        Thread thread = new Thread(new MyRunnable()); //MyRunnable implements Runnable
        thread.start();
    }
}

【问题讨论】:

    标签: garbage-collection singleton


    【解决方案1】:

    一般来说,当一个对象成为垃圾回收的候选对象时 它不再在范围内 并且 没有任何东西引用它

    在这种情况下,假设 Thread 对象在完成执行后没有引用它,它将成为垃圾回收的候选对象。在您的示例中,您的单例实例不 包含 对 Thread 对象的任何引用 - 它调用 runMyThread() 创建一个新的 Thread 对象并启动它。 Thread 对象的作用域包含在 runMyThread() 方法中。

    【讨论】:

      猜你喜欢
      • 2020-11-29
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-04
      相关资源
      最近更新 更多