为了进行测试,我创建了一个仅休眠的线程。而且我知道即使使用完毕,GC也不会在一段时间内收集它们,但是当您在完成它们的任务后不将它们保留为对象时,它们应该消失了。
因此,出于测试目的,我使用了Java VisualVM,但这是我第一次使用它。而且我看到所有这些计时器线程都在0ms左右,但我仍然可以看到它们。这正常吗?那是什么意思呢?如果我向成千上万的垃圾邮件发送垃圾邮件,会降低我的应用程序运行速度吗?
答案 0 :(得分:0)
您将看到所有Thread-
线程,因为默认情况下,VisualVM将向您显示所有线程(包括那些在监视会话期间完成的线程)。要仅查看Live
个线程,请将View
组合从All threads
切换到Live threads
。 VisualVM不会不保留对所有启动线程的引用,可以对它们进行垃圾回收。
答案 1 :(得分:-1)
一旦VisualVM连接到正在运行的JVM, it 将保留对所有启动线程的引用,因此当线程停止运行时,不会Thread
对象被垃圾回收。
它们由VisualVM保留,因此您仍然可以查看为其收集的统计信息。
一旦退出VisualVM,Thread
对象将变得不可访问且可访问GC,因此停止和重新启动VisualVM将“清除”已结束线程的列表。