JVM的生命周期

简介: package test; public class JVMTestLife { public static void main(String[] args) { new Thread(new Runnable() { ...
package test;  
  
public class JVMTestLife {  
    public static void main(String[] args) {  
        new Thread(new Runnable() {  
            @Override  
            public void run() {  
                for(int i=0;i<5;i++){  
                    try {  
                        Thread.currentThread().sleep(i*10000);  
                        System.out.println("睡了"+i*10+"秒");  
                    } catch (InterruptedException e) {  
                        System.out.println("干嘛吵醒我");  
                    }  
                }  
            }  
        }).start();   
          
        for(int i=0;i<50;i++){  
                System.out.print(i);  
        }  
    }  
}  

观察控制台输出和任务管理器的javaw.exe会发现,当main函数的for循环打印完的时候,程序居然没有退出,而等到整个new Thread()里的匿名类的run方法执行结束后,javaw.exe才退出。

我们知道在c++的win32编程(CreatThread()),main函数执行完了,寄宿线程也跟着退出了,在c#中如果你用线程池(ThreadPool)的话,结论也是如此,线程都跟着宿主进程的结束而结束。但是在java中貌似和我们的认知有很大的出入,这是为什么呢?

这是由于java的虚拟机种有两种线程,一种叫叫守护线程,一种叫非守护线程,main函数就是个非守护线程,虚拟机的gc就是一个守护线程。java的虚拟机中,只要有任何非守护线程还没有结束,java虚拟机的实例都不会退出,所以即使main函数这个非守护线程退出,但是由于在main函数中启动的匿名线程也是非守护线程,它还没有结束,所以jvm没办法退出。

java虚拟机的生命周期,当一个java应用main函数启动时虚拟机也同时被启动,而只有当在虚拟机实例中的所有非守护进程都结束时,java虚拟机实例才结束生命。

 

目录
相关文章
|
7月前
|
安全 Java
JVM的类的生命周期
JVM的类的生命周期
|
7月前
|
存储 Java 程序员
【JVM系列笔记】类生命周期
类的生命周期包括加载、连接(验证、准备、解析)、初始化、使用和卸载五个阶段。加载时,类加载器根据全限定名获取字节码,然后在方法区中创建InstanceKlass对象,并在堆上生成对应的Class对象。连接阶段验证字节码的正确性,准备阶段为静态变量分配内存并赋初始值,解析阶段将符号引用转换为直接引用。初始化阶段执行clinit方法,如静态变量赋值和静态代码块。类的初始化在访问静态成员、使用Class.forName、创建类实例或其子类时触发。
106 1
|
7月前
|
监控 安全 Java
JVM工作原理与实战(七):类的生命周期-初始化阶段
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了类的生命周期、类的初始化阶段等内容。
61 5
|
7月前
|
存储 监控 安全
JVM工作原理与实战(五):类的生命周期-加载阶段
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了类的生命周期、类的加载阶段等内容。
87 5
|
7月前
|
存储 安全 Java
JVM工作原理与实战(六):类的生命周期-连接阶段
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了类的生命周期、类的连接阶段等内容。
67 4
|
存储 Java
【面试题精讲】JVM*类的生命周期*加载阶段
【面试题精讲】JVM*类的生命周期*加载阶段
|
Java API
【面试题精讲】JVM-类的生命周期-连接阶段
【面试题精讲】JVM-类的生命周期-连接阶段
|
存储 缓存 安全
【面试题精讲】JVM-类的生命周期
【面试题精讲】JVM-类的生命周期
|
安全 Java 编译器
【面试题精讲】JVM-类的生命周期-初始化阶段
【面试题精讲】JVM-类的生命周期-初始化阶段
|
XML Java 测试技术
JVM && 软件测试的目的和原则 && Spring基本概念 && 项目创建 && 软件测试的生命周期 && SpringBoot创建和运行 && Bean作用域
JVM && 软件测试的目的和原则 && Spring基本概念 && 项目创建 && 软件测试的生命周期 && SpringBoot创建和运行 && Bean作用域
97 0