Java VisualVM 如何显示非 running/finished 的线程?

How Java VisualVM shows threads that are not running/finished?

为了测试,我创建了一个刚刚在其中休眠的线程。而且我知道 GC 不会在一段时间内收集它们,即使它们的使用已经完成,但是当你在它们完成任务后不将它们作为对象保留时,它们应该已经消失了。

因此出于测试目的,我使用了 Java VisualVM,但这是我第一次使用它。我看到所有这些计时器线程都在 0 毫秒左右,但我仍然可以看到它们。这是正常的吗?这是什么意思?如果我向他们发送数千个垃圾邮件,它会减慢我的应用程序吗?

一旦 VisualVM 连接到 运行 JVM, 将保留对所有启动线程的引用,因此那些 Thread 对象在线程停止 运行.

它们由 VisualVM 保留,因此您仍然可以看到为它们收集的统计信息。

一旦您退出 VisualVM,Thread 对象将变得无法访问并且可以进行 GC,因此停止并重新启动 VisualVM 将 "clear" 已结束线程的列表。

您会看到所有 Thread- 个线程,因为默认情况下 VisualVM 会向您显示所有线程(包括那些在监视会话期间完成的线程)。要仅查看 Live 个线程,请将 View 组合从 All threads 切换到 Live threads。 VisualVM 不会 保留对所有已启动线程的引用,它们可以很好地进行垃圾回收。