DestroyJavaVM线程始终在运行

时间:2015-12-23 10:12:30

标签: java multithreading jvm java-threads

在分析我的应用程序时,我遇到了一个奇怪的行为 - DestroyJavaVM线程始终在运行 - 100%的时间。

enter image description here 在对这个主题进行了一些研究之后,在网上几乎没有任何有价值的信息,我所理解的是这个主题应该是unload the JVM upon exit

如果是这样的话,为什么这个线程从我开始申请的第一个时刻起100%的时间处于RUNNING状态?它是否会消耗宝贵的资源,因此可能会导致OutOfMemoryError(就像我有时会得到的那样)?

这个线程实际上做了什么,是什么触发了它的初始化?

由于

2 个答案:

答案 0 :(得分:45)

这是因为大多数应用程序都在线程中运行。

所有POJO个应用都以调用main方法开始。在最简单的情况下,此方法将执行所有工作,创建对象,调用方法等。一旦main完成,JVM将被告知使用等待的DestroyJavaVM线程关闭在完成任务之前完成所有非守护程序线程。这是为了确保您创建的任何非守护程序线程在JVM拆除之前运行完成。

但是,具有GUI的应用程序通常作为多个线程运行。一个用于监视系统事件,如键盘或鼠标事件。一个用于维护窗口和显示等。这种应用程序的main方法可能只是启动所有必需的线程并退出。它仍然会创建DestroyJavaVM线程,但现在所做的就是在拆除虚拟机之前等待所有创建的线程完成。

因此,任何创建线程并仅依赖于其功能的应用程序总是会有一个DestroyJavaVM线程等待它完成。由于它所做的只是join所有其他正在运行的线程,它不会消耗任何资源。

答案 1 :(得分:0)

这几乎没有划伤表面。它有助于识别系统触发的退出和强制退出,并且应用程序必须知道如何响应 不会被非守护进程无限期阻塞。

作为 Java 程序员,我需要知道操作系统何时告诉应用程序关闭(以便我可以保存用户的工作)。