销毁始终运行的 JavaVM 线程

2022-09-01 19:49:42

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

enter image description here在对这个主题做了一些研究之后,网上几乎没有任何有价值的信息,我所理解的只是这个线程应该在退出时卸载JVM

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

是否有任何官方参考此线程实际执行的操作以及触发其初始化的原因?

谢谢


答案 1

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

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

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

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


答案 2

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

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