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类的信息存放在方法中
***/
//总结:对象的实例保存在堆上,对象的引用保存在栈上,对象的类信息保存在方法区中;