创建的线程实例是驻留在堆中还是其他任何位置?

时间:2011-05-16 04:48:40

标签: java jvm

在实例化一个线程并启动它之后,它所创建的实例会发生什么。它会与其他实例具有相同的行为吗?

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

a = null

这个创建的Thread实例所在的位置(在堆中或者不在终身空间中)。它会被垃圾收集吗?如果是垃圾收集使用的实例属性发生了什么?

2 个答案:

答案 0 :(得分:1)

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

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


  

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

  1. 这并不能证明它已被垃圾收集。所有证明都是JProfiler找不到它。

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

答案 1 :(得分:0)

根据定义,只要该线程处于活动状态,就可以通过它自己的线程访问Thread对象 - 很明显,不,Thread对象至少在启动的线程之前不会被GC住。