所有这些默认线程都应该运行吗? 他们是否让我的JVM活着?

我有一个关于我的应用程序在执行期间产生的线程及其状态的问题。

我有一个Swing应用程序,并且在一些测试场景中使用Java VisualVM注意到了一些奇怪的行为。 运行我的程序30+分钟无所事事(刚开始并让它在那里运行)我注意到以下内容。

首先,在“线程”选项卡中,我看到很多活动线程。 30分钟左右之后我的申请情况没有做任何事情

读取(除其他外)默认线程,如DestroyJavaVM,Reference Handler,Signal Dispatcher和Java应用程序开始执行时spwaned的线程是什么? 我明白大部分这些线程都有很好的理由在那里。 (我仍然试图找出“RMI TCP”)
然而,我对他们的状态感到怀疑。 他们的前六名在100%的时间内处于跑步状态是否正常?

另外,这些线程中的任何一个都可以解释如下的堆消耗? 我的应用程序堆消耗无所事事,超过30分钟

我注意到许多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

    如果考虑到线程和内存消耗, 你的应用程序是完全正常的 。 别担心!

    也可以看看

  • 为什么是锯齿形图?
  • System.exit(0)vs JFrame.EXIT_ON_CLOSE
  • 链接地址: http://www.djcxy.com/p/93611.html

    上一篇: Should all these default threads be Running? And do they keep my JVM alive?

    下一篇: MySQL Performance issue with large number of rows