在分析我的应用程序时,我遇到了一个奇怪的行为-DestroyJavaVM线程总是在运行- 100%的时间。
在对这个主题做了一点研究之后,网上几乎没有任何有价值的信息,我所理解的就是这个线程应该是unload the JVM upon exit。
如果是这样的话,为什么这个线程从我启动应用程序的那一刻起就100%处于RUNNING状态?它不是消耗了宝贵的资源,因此可能会导致OutOfMemoryError
(就像我有时会得到的)吗?
是否有任何正式的参考资料来说明这个线程实际上是做什么的,以及什么触发了它的初始化?
谢谢
2条答案
按热度按时间rdrgkggo1#
这是因为大多数应用程序都是在线程中运行的。
所有的POJO应用程序都是通过调用
main
方法来启动的。在最简单的情况下,这个方法将完成所有的工作,创建对象,调用方法等等。一旦main
完成,JVM被告知使用DestroyJavaVM
线程关闭,该线程等待所有non-daemon threads完成后再执行其工作。这是为了确保任何非您创建的守护进程线程在JVM关闭之前运行完成。然而,具有GUI的应用程序通常以多个线程的形式运行。一个线程用于监视系统事件,如键盘或鼠标事件。一个线程用于维护窗口和显示等。此类应用的
main
方法可能只会启动所有需要的线程并退出。它仍然会创建DestroyJavaVM
线程,但现在它所做的只是等待您创建的所有线程完成,然后再关闭虚拟机。因此,任何创建线程并完全依赖其功能的应用程序都将始终有一个
DestroyJavaVM
线程等待它完成。由于它所做的一切都是join
处理所有其他正在运行的线程,因此它不会消耗任何资源。wsxa1bj12#
这仅仅触及了表面,它有助于识别系统触发的Quits和ForceQuits,并且应用必须知道如何响应,而不会被非守护进程线程无限期地阻塞。
作为一名Java程序员,我需要知道操作系统何时通知应用程序关闭(这样我就可以保存用户的工作)。