2011-05-16 63 views
0

在实例化一个线程并启动它之后,它会对其创建的实例发生什么。它是否与其他实例具有相同的行为?创建的线程实例驻留在Heap中还是任何其他位置?

Thread a = new MyThread(); 
a.start(); 

a = null 

线程创建的实例驻留(在堆中或不在占用空间中)。它会被垃圾收集?如果它被垃圾收集发生了什么事情使用实例属性?

+0

只是......想。如果DID收集垃圾会发生什么?这将是可怕的,没有体面的语言设计师会让这种事情发生。 (用简单明了的方式说明它:它不会被垃圾收集,直到它不再被引用,并且它被引用,直到线程结束为止) – naiad 2011-05-16 04:55:08

+1

可能重复的[Java Thread Garbage collected or not](http:// stackoverflow.com/questions/2423284/java-thread-garbage-collected-or-not) – 2011-05-16 04:55:58

+0

在这种情况下由谁引用 – asela38 2011-05-16 04:57:30

回答

1

不管是否可以访问Thread对象,线程在“活动”时都不会被垃圾收集。这是JLS对可达性定义的结果。

为了记录,一个典型的JVM在内存中分配一个线程的堆栈,这个堆栈在堆之外。 Thread对象及其子对象是常规的堆对象。这些可能被垃圾收集:规范是沉默的,AFAIK。最后,线程状态的一部分可能驻留在OS内核管理的内存中。


,当我通过JProfiler的查看JVM我无法找到我创建MyThread的实例。

  1. 这并不能证明它已经被垃圾回收。它证明了JProfiler找不到它。

  2. 如果线程已终止(并且您没有保留对Thread对象的引用),那么它/它们将不再可及,并且JProfile将无法找到它。

+0

当我通过JProfiler查看JVM时我无法找到我创建的MyThread的实例 – asela38 2011-05-16 04:55:36

0

通过这个定义,Thread对象是可达由它自己的线程,只要线程是活的 - 那么清楚,不,Thread对象将不会被至少GC'd直到它开始线程住。

相关问题