所有这些默认线程都应该运行吗? 他们是否让我的JVM活着?
我有一个关于我的应用程序在执行期间产生的线程及其状态的问题。
我有一个Swing应用程序,并且在一些测试场景中使用Java VisualVM注意到了一些奇怪的行为。 运行我的程序30+分钟无所事事(刚开始并让它在那里运行)我注意到以下内容。
首先,在“线程”选项卡中,我看到很多活动线程。
读取(除其他外)默认线程,如DestroyJavaVM,Reference Handler,Signal Dispatcher和Java应用程序开始执行时spwaned的线程是什么? 我明白大部分这些线程都有很好的理由在那里。 (我仍然试图找出“RMI TCP”)
然而,我对他们的状态感到怀疑。 他们的前六名在100%的时间内处于跑步状态是否正常?
另外,这些线程中的任何一个都可以解释如下的堆消耗?
我注意到许多HashMap $ Entry和TreeMap $ Entry的实例都是由来自sun.rmi。*的库引用和创建的,我认为它可能与“RMI TCP”线程有关......
最后但并非最不重要的是,如果我尝试处理()我的主要JFrame,框架本身将消失,但应用程序仍将运行....可能这些线程是原因(或其中的一部分)?
谢谢大家。
我仍试图找出“RMI TCP”
这些线程用于通过RMI接受和处理JMX连接。 在查看JVisualVM时,您正在使用一个。 你有没有注意到工作线程名称中的IP?
然而,我对他们的状态感到怀疑。 他们的前六名在100%的时间内处于跑步状态是否正常?
仅仅因为线程是可运行的,并不意味着它正在运行并消耗CPU时间。 引用Thread.State
:
新 - 尚未开始的线程处于此状态。
RUNNABLE - 在Java虚拟机中执行的线程处于此状态。
BLOCKED - 阻塞等待监视器锁定的线程处于此状态。
等待 - 无限期等待另一个线程执行特定操作的线程处于此状态。
TIMED_WAITING - 正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。
TERMINATED - 已退出的线程处于此状态。
正如你可以看到这个列表并没有提到有关等待I / O像套接字一样。 执行此任务的线程仍被标记为可运行。 清楚地等待数据不会消耗任何CPU。 接受连接的线程也是可运行的,而它什么都不做。 当客户端尝试建立新的连接时它会被唤醒。
另外,这些线程中的任何一个都可以解释如下的堆消耗?
你的堆消耗是正常和健康的。 锯齿形状是由垃圾收集去除不再需要的对象造成的。 JVM还发现你的堆消耗量非常稳定,因此它不断减小最大堆大小,因为它认为你不需要那么多(橙色图)。
最后但并非最不重要的是,如果我尝试处理()我的主要JFrame,框架本身将消失,但应用程序仍将运行....可能这些线程是原因(或其中的一部分)?
那是因为你只关闭了一个JFrame
,而不是整个应用程序。 Swing EDT(事件分派线程)仍在运行。 但这与它无关。 只需使用:
jFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
在你的主框架上。
TL; DR
如果考虑到线程和内存消耗, 你的应用程序是完全正常的 。 别担心!
也可以看看
上一篇: Should all these default threads be Running? And do they keep my JVM alive?