1.Java虚拟机的生命周期
每个Java程序都运行于某个具体的Java虚拟机实现的实例上。当启动一个Java程序时,一个虚拟机实例就诞生了。当该程序关闭时,虚拟机实例也随之消亡。如果在同一台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例。
每个虚拟机实例通过调用某个初始类的main()方法来运行一个Java程序。这个main()方法必须是public,static,返回值为void,并且接受一个字符串数组作为参数。任何拥有这样一个main()方法的类都可以作为Java程序运行的起点。main()方法的声明如下:
public static void main(String[] args) {}
Java程序初始类中的main()方法,将作为该程序初始线程的起点,任何其他的线程都是由这个初始线程启动的。JVM内部有两种线程:守护线程和非守护线程(用户线程)。守护线程通常由JVM自己使用,如执行垃圾收集任务的线程;也可以将创建的线程标记为守护线程(调用setDeamon()方法创建一个守护线程,守护线程创建的线程默认为守护线程),它从属于创建它的线程,当主线程结束时,守护线程也随之消亡。不是守护线程的线程称为用户线程。用户线程有自己的生命周期,不依赖于创建它的线程。只要还有任何非守护线程在运行,那么这个Java程序也在运行,当然JVM也仍然存活。
2.JVM的内部体系结构
Java虚拟机的内部体系结构如下图所示:

每个Java虚拟机都有一个类装载器子系统,它根据给定的全限定名来装入类型;同样,每个虚拟机都有一个执行引擎,它负责执行那些包含在被装载类的方法中的指令。“运行时数据区”用于保存类型信息,字节码,对象,参数,局部变量,中间变量等运行时数据。JVM实例都包含一个方法区和堆区,它们被所有的线程共享,方法区用于保存所有被装载类的class文件中的类型信息,Java程序运行过程中创建的对象存储到堆区中。每当一个新线程被创建时,它都有属于自己的PC寄存器和一个Java栈(私有的,其他线程无法访问)。Java栈总是保存该线程中正在执行的Java方法(非本地方法)的状态,包括局部变量,参数,返回值以及中间结果。而本地方法的调用的状态则存储在本地方法栈中。Java栈由许多栈帧组成,一个栈帧包含一个Java方法调用的状态。当线程调用一个Java方法时,JVM压入一个栈帧到该线程对应的Java栈中,当该方法返回时,这个栈帧被被从Java栈中弹出并抛弃。