java - DestroyJavaVM 线程始终运行

标签 java multithreading jvm java-threads

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

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

如果是这样,为什么从我启动我的应用程序的第一刻起,这个线程就有 100% 的时间处于 RUNNING 状态?它不会消耗宝贵的资源并因此可能导致 OutOfMemoryError(就像我有时遇到的那样)吗?

是否有任何关于此线程实际执行的操作以及触发其初始化的官方引用?

谢谢

最佳答案

发生这种情况是因为大多数应用程序都是在线程中运行的。

全部POJO应用程序首先调用 main 方法。在最简单的情况下,此方法将完成所有工作,创建对象、调用方法等。main 完成后,使用 DestroyJavaVM 告知 JVM 关闭等待所有non-daemon threads的线程在开始工作之前完成。这是为了确保您创建的任何非守护线程在 JVM 被拆除之前运行完成。

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

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

关于java - DestroyJavaVM 线程始终运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34433267/

相关文章:

java - 无法将 jconsole 连接到远程服务器,tomcat 无法启动

同一台机器上的Java堆空间分配

java - TabLayout 中的选项卡没有填满整个 ActionBar

java - 如何识别不定冠词 "a"或 "an"?

java - 在android中绘制路径?

java - 按顺序处理异步事件和发布结果

c++ - OpenMP 动态与引导式调度

java - 我怎样才能找到我的线程在哪里被中断?

java - Jackson YAML - 将 null 序列化为空值

.net - DotNET上是否有等效的JVisualVM?