Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java VisualVM如何显示未运行/完成的线程?_Java_Multithreading_Jvm_Visualvm_Jvisualvm - Fatal编程技术网

Java VisualVM如何显示未运行/完成的线程?

Java VisualVM如何显示未运行/完成的线程?,java,multithreading,jvm,visualvm,jvisualvm,Java,Multithreading,Jvm,Visualvm,Jvisualvm,为了进行测试,我创建了一个线程,它刚刚在其中休眠。我知道GC暂时不会收集它们,即使它们的使用已经完成,但当它们完成任务后,你没有将它们作为对象保存时,它们应该已经消失了 因此,出于测试目的,我使用了Java VisualVM,但这是我第一次使用它。我看到所有这些计时器线程都是0毫秒,但我仍然可以看到它们。这正常吗?这意味着什么?如果我向数千个线程发送垃圾邮件,它会减慢我的应用程序的速度吗?一旦VisualVM连接到正在运行的JVM,它将保留对所有已启动线程的引用,这样当线程停止运行时,这些线程对

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


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

一旦VisualVM连接到正在运行的JVM,它将保留对所有已启动线程的引用,这样当线程停止运行时,这些
线程
对象不会被垃圾收集

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


退出VisualVM后,
线程
对象将变得不可访问和GC'able,因此停止和重新启动VisualVM将“清除”已结束线程的列表。

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

如果线程一结束就从列表中消失,您就没有时间分析结果了,是吗?因此,当应用程序被监控时,线程将继续运行,以满足您的调试需求。因此,当我运行应用程序时,这些白色的线程框将不会出现?请尝试停止并重新启动VisualVM@Andreas基本上我要问的是,这个代码“new Thread(task).start()”会不会给我带来任何问题?因为它会被大量地完成。这是两个不同的问题。正如Andreas所说,这些线程不再处于活动状态,因此可能不会消耗任何资源(在该视图中无法识别它们是否处于活动状态)。但这并不意味着
新线程(task).start()
是推荐的编码样式。如果你“大量”这样做,你是在浪费资源。您应该使用具有最大线程限制的线程池,以允许重用线程。请尝试或
newCachedThreadPool()
我可以向您保证VisualVM不会保留对所有已启动线程的引用。