java - 创建的线程实例是驻留在堆中还是其他地方?

标签 java jvm

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

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

a = null

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

最佳答案

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

根据记录,典型的 JVM 在堆外部的内存中分配线程堆栈。 Thread 对象及其子对象是常规堆对象。这些可能被垃圾收集:据我所知,规范对此没有提及。最后,线程状态的一部分可能驻留在操作系统内核管理的内存中。

<小时/>

when I view the JVM through the JProfiler I was unable to find the instance of the MyThread which I create.

  1. 这并不能证明它已被垃圾收集。它只能证明 JProfiler 找不到它。

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

关于java - 创建的线程实例是驻留在堆中还是其他地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6013271/

相关文章:

java - 计算 0 的阶乘导致 NoSuchElementException

c# - 来自 Model 的完整 Java/C# 代码生成工具?

Java:我可以更改 HTTP header 并读取 header 服务器端吗?

java - 一个简单的 "Hello World"在 64 位机器上需要 10G 虚拟内存,而在 32 位机器上需要 1G?

java - 如何使用 Eclipse OpenJ9 进行堆转储?

java - 静态方法与内部类方法 - 性能 [java 8]

Java 6 更新 25 虚拟机崩溃 : insufficient memory

java - JVM 会被扩展以处理泛型吗?

java - Maven-Assembly-插件步骤失败: "[WARNING] The following patterns were never triggered in this artifact inclusion filter"

java - GmailApiQuickstart 错误