为什么 JVM 需要退出

  • 本文关键字:退出 JVM java
  • 更新时间 :
  • 英文 :


我正在研究"什么是java中的deamon线程"

它提到"守护进程线程是一个线程,它不会阻止JVM在程序完成但线程仍在运行时退出"。

我的后续问题是为什么 JVM 需要退出或不退出?这是怎么回事?我认为JVM一直在运行。是真的吗?我为什么要关心JVM是否在做?

public class Example{
    public static void main(String[] args){
        System.out.println("Hi!");
        // What's happening here?
    }
}

看看评论说这里发生了什么?那里发生了什么?JVM是关于退出的,因为你的程序即将完成。java 虚拟机的持续时间只与您的程序一样长,它在程序开始时启动,在程序结束时结束。

现在,如果我们考虑:

public class Example{
    public static void main(String[] args){
        System.out.println("Hi!");
        Thread t = new Thread(new Runnable(){
            public void run(){
                try{
                    Thread.sleep(Long.MAX_VALUE);
                }catch(InterruptedException ex){}
            }
        });
        t.start();
        // What's happening here?
    }
}

在评论存在的地方会发生什么。答案是没有。由于另一个线程仍然处于活动状态且非守护进程,程序将继续运行(因此 JVM 不会退出)。结束它的唯一方法是完成睡眠或手动终止运行应用程序的进程。

用最简单的术语来说(如果你是迂腐的,并不是最正确的),Java应用程序的JVM的运行寿命可以等同于应用程序本身的运行寿命。在大多数情况下,您可以将术语 JVM 替换为"我的应用程序",而不会有太大问题。

希望能清除它。

Deamon线程

就像一个支持执行的实用程序线程。例如,memory management是支持进程内存管理的Deamon线程。进程完成后,如果它不是 Deamon 线程,它将永远运行。所以你的过程永远不会结束。但是 JVM 应该在完成该过程后停止。因此,当您的系统仅运行守护进程线程时,JVM 会停止。

public class ThreadExample {
    public static void main(String args[]){
        new DeamonThread().start();
        for(int i=0;i<5;i++){
            System.out.println("Main thread is running "+ i+" time");
        }
    }
}
class DeamonThread extends Thread{
    DeamonThread(){
        setDaemon(true);
    }
    public void run(){
        int count=0 ;
        while (true) {
            System.out.println("Hello from Deamon Thread "+count++) ;
            try {
                sleep(1000);
            } catch (InterruptedException e) {}
        }
    }
}

在此示例中,主线程仅包含 5 次迭代。但是Deamon线程有无限的迭代。如果它不是恶魔线程,它将永远运行。但是它是一个守护线程,所以当主线程(不是守护进程线程)完成时,JVM 就会停止。

Daemon threads are helping threads,例如垃圾回收是一个守护线程。

守护进程线程不应持有任何资源。如果您违反了此基本规则,那么您的线程不符合成为守护进程线程的条件。

运行完所有线程并且只剩下守护程序线程后,JVM应该停止,因为线程池中没有其他线程挂起。

不,JVM 并不总是在运行。通常它根本不运行。当您启动基于 Java 的程序时,这将启动 JVM 进程的实例。如果你启动了几个基于 Java 的程序,或者一个程序的几个实例,那么你会得到几个 JVM。它们不会被重复使用,所以旧的是无用的,当你的应用程序完成时需要消失,以防止消耗内存。查看您的系统任务管理器,您将看到 JVM 何时运行,以及有多少正在运行。

即使有一个 JVM 始终在运行,一旦应用程序的工作完成,应用程序的线程仍然需要终止,否则线程仍将浪费内存和资源。

因此,无论 JVM 是否始终运行,能够将线程设置为守护线程仍然很有用,因为您不必记住手动停止它们。一旦非守护程序线程完成,守护程序线程就会自行停止。

您可能会

将守护程序线程与守护进程混淆。您可以在需要时轻松地将 JVM 作为守护进程运行(即您正在运行服务器)。这与在大多数操作系统中将任何其他进程作为守护程序运行非常相似。然而,Java 守护进程线程是不同的,您通常不会使用它们来运行特定于服务器的任务。例如,您可以将它们用于清理任务。

最新更新