始终销毁 JavaVM 线程 运行

DestroyJavaVM thread ALWAYS running

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

在对这个主题做了一些研究之后,网上几乎没有任何有价值的信息,我只知道这个线程应该 unload the JVM upon exit.

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

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

谢谢

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

所有 POJO apps start by invoking the main method. In its most simple case, this method will do all of the work, creating objects, calling methods etc. Once main completes, the JVM is told to shut down using a DestroyJavaVM thread which waits for all non-daemon threads 在开始工作之前完成。这是为了确保您创建的任何非守护线程 运行 在 JVM 被拆除之前完成。

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

因此,任何创建线程并仅依赖其功能的应用程序将始终有一个 DestroyJavaVM 线程等待它完成。因为它所做的只是 joining 所有其他 运行ning 线程,所以它不消耗任何资源。

这只是表面现象。它有助于识别存在系统触发的退出和强制退出,应用程序必须知道如何响应 不会被非守护线程无限期阻塞。

作为一名 Java 程序员,我需要知道 OS 何时通知应用程序关闭(以便我可以保存用户的工作)。