JVM

178 阅读1分钟

1. jvm的生命周期,以及守护线程和非守护线程

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

守护线程: 当main函数执行完毕,并且没有非守护线程执行的情况下;这时,jvm的生命周期结束,守护线程便不再执行;

//设置为守护线程
thread.setDeamon(true);
虚拟机的gc(垃圾回收机制)就是一个典型的守护线程。

非守护线程: 当main函数执行完毕,非守护线程仍然继续执行,直到所有非守护线程执行完毕,jvm才会结束。

public static void main(String[] args) {
    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep(5000);
                System.out.println("线程结束");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    });
//        t.setDaemon(true);//设置守护线程,当main线程结束之后,没有非守护线程执行了,
//        jvm就会主动关闭,所以就不会再执行守护线程的内容了
//        非守护线程【用户线程】:再main结束之后,一定要等到所有的非守护线程执行完毕,jvm才会关闭,
    t.start();
    System.out.println("main 线程打印完毕");
}

2. jvm的堆,栈,方法区(又叫永久代)

Student s = new Student();
/***
*   s是指针存放在栈中
*   new Student();是对象,存放在堆中
*   Student类的信息存放在方法中
***/
//总结:对象的实例保存在堆上,对象的引用保存在栈上,对象的类信息保存在方法区中;