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

Java 创建的线程实例是驻留在堆中还是其他任何位置?,java,jvm,Java,Jvm,在实例化一个线程并启动它之后,所创建的线程实例将发生什么情况。它是否与其他实例具有相同的行为 Thread a = new MyThread(); a.start(); a = null 创建的线程实例所在的位置(在堆中或不在永久空间中)。它会被垃圾收集吗?。如果是“获取垃圾收集”,那么已使用的实例属性会发生什么情况?当线程处于“活动”状态时,将不会对其进行垃圾收集,而不管是否可以访问线程对象。这是JLS对可达性定义的结果 作为记录,典型的JVM在堆之外的内存中分配线程堆栈。线程对象及其子对

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

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

a = null

创建的线程实例所在的位置(在堆中或不在永久空间中)。它会被垃圾收集吗?。如果是“获取垃圾收集”,那么已使用的实例属性会发生什么情况?

当线程处于“活动”状态时,将不会对其进行垃圾收集,而不管是否可以访问
线程
对象。这是JLS对可达性定义的结果

作为记录,典型的JVM在堆之外的内存中分配线程堆栈。
线程
对象及其子对象是常规堆对象。这些可能是垃圾收集的:恕我直言,规范对此没有任何规定。最后,线程状态的一部分可能位于操作系统内核管理的内存中



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

  • 这并不能证明它是被垃圾收集的。它所证明的只是JProfiler找不到它

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


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

    。。。想想看。如果垃圾被收集起来会发生什么?这将是可怕的,没有一个像样的语言设计师会让这种情况发生。(用简单明了的方式说明它:在不再引用它之前,它不会被垃圾收集,直到线程结束才被引用)在这种情况下,“创建的实例”和“其他实例”是什么意思?当我通过JProfiler查看JVM时,我无法找到我创建的MyThread的实例