在实例化一个线程并启动它之后,它所创建的实例会发生什么。它会与其他实例具有相同的行为吗?
Thread a = new MyThread();
a.start();
a = null
这个创建的Thread实例所在的位置(在堆中或者不在终身空间中)。它会被垃圾收集吗?如果是垃圾收集使用的实例属性发生了什么?
答案 0 :(得分:1)
线程在“实时”时不会被垃圾收集,无论是否可以访问Thread
对象。这是JLS定义可达性的结果。
对于记录,典型的JVM在堆内部的内存中分配线程的堆栈。 Thread
对象及其子对象是常规堆对象。这些可能被垃圾收集:规范对此无声,AFAIK。最后,线程状态的一部分可能驻留在由OS内核管理的内存中。
当我通过JProfiler查看JVM时,我无法找到我创建的MyThread的实例。
这并不能证明它已被垃圾收集。所有证明都是JProfiler找不到它。
如果线程已终止(并且您没有保留对Thread
对象的引用),则它/它们将不再可访问,并且JProfile将无法找到它。
答案 1 :(得分:0)
根据定义,只要该线程处于活动状态,就可以通过它自己的线程访问Thread对象 - 很明显,不,Thread
对象至少在启动的线程之前不会被GC住。