java GC 是否考虑了在另一个线程中进行的引用?

假设定义了一个局部变量,然后传递给 Thread 构造函数,在那里它被保存为该线程的私有字段。然后,线程开始连续运行(基本上是永远),而原始方法结束。


局部变量引用没了,但是GC有没有考虑到Thread对象存储的引用?


我的场景类似于这个示例片段:


...


public static void Main(String... args) {

  Foo foo = new Foo()

  MyThread thread = new MyThread(foo)

  ExecutorService executor = Executors.newSingleThreadExecutor();

  executor.execute(thread)

}


...


public class MyThread implements Runnable {


  private Foo foo;


  public MyThread(Foo foo) {

     this.foo = foo;

  }


  public void run() {

     while (true) {

         this.foo.print(); // << throws NullPointerException

         sleep(...)

     }

  }

}


温温酱
浏览 176回答 1
1回答

慕尼黑的夜晚无繁华

简而言之,是的,GC确实考虑了存储在MyThread类中的引用,并且不会删除引用的对象。这是因为 Java 的垃圾收集器只会销毁无法访问的对象,即代码中任何地方都没有引用的对象(不完全是一般规则,请查看弱引用)。该变量foo不是一个实际的对象,而是对一个对象的引用。当您传递foo到MyThread的构造函数时,您不是在传递对象,而是对它的引用。在构造函数内部,您正在复制此引用并将其存储在MyThread.&nbsp;由于run()该类的方法将“永远”运行(意味着 的实例MyThread“活着”),有问题的引用将“永远”活着,从而防止被引用的对象被垃圾收集。请注意,MyThread's name 是错误的,可以这么说。它不会扩展Thread,因此,它不是一个线程。它只是Runnable接口的一个实现。更准确的名称是MyRunnable.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java