在分析我的应用程序时,我发现了一个奇怪的行为——DestroyJavaVM线程始终在运行——一直占用100%的时间。
在对这个主题进行一些研究后,我发现几乎没有有价值的在线信息。我所理解的是,这个线程应该在退出时卸载JVM。
如果是这样,为什么这个线程从我启动我的应用程序的第一刻起就处于运行状态呢?它不会消耗宝贵的资源,因此可能会导致OutOfMemoryError
(就像我有时会遇到的那样)吗?
有没有任何官方参考资料说明这个线程实际上做了什么以及是什么触发了它的初始化?
谢谢
在分析我的应用程序时,我发现了一个奇怪的行为——DestroyJavaVM线程始终在运行——一直占用100%的时间。
在对这个主题进行一些研究后,我发现几乎没有有价值的在线信息。我所理解的是,这个线程应该在退出时卸载JVM。
如果是这样,为什么这个线程从我启动我的应用程序的第一刻起就处于运行状态呢?它不会消耗宝贵的资源,因此可能会导致OutOfMemoryError
(就像我有时会遇到的那样)吗?
有没有任何官方参考资料说明这个线程实际上做了什么以及是什么触发了它的初始化?
谢谢
main
方法启动。在最简单的情况下,此方法将完成所有工作,创建对象,调用方法等。一旦main
完成,JVM会使用DestroyJavaVM
线程告知其关闭,并在执行其工作之前等待所有非守护线程完成。这是为了确保您创建的任何非守护线程在JVM关闭之前都能运行到完成。main
方法可能只是启动所有所需的线程并退出。它仍然创建DestroyJavaVM
线程,但现在它所做的只是等待您创建的所有线程完成后再关闭VM。DestroyJavaVM
线程在等待其完成。由于它只是join
所有其他正在运行的线程,因此它不会消耗任何资源。main
函数结束后创建和启动。参见 Thread.join(),了解为何它处于“运行”状态 - 它在一个紧凑循环中使用 wait(0)
方法。 - OldCurmudgeon这只是皮毛。有系统触发的退出和强制退出,应用程序必须知道如何响应,而不会被非守护线程无限期地阻塞。
作为一名Java程序员,我需要知道操作系统何时告诉应用程序关闭(以便保存用户的工作)。
OOME
。我不会从最不明显的嫌疑人开始。您是否对应用程序线程进行了内存使用分析?这将是调试您神秘的OOME
的直接方法。 - Kayaman