1.java虚拟机的生命周期
当启动一个java程序时,一个虚拟机实例也就生成了,当该程序关闭退出,这个虚拟机实例也就随之消亡。
java虚拟机内部有两种线程 ,守护线程和非守护线程,守护线程是执行垃圾收集的线程,而java程序中的初始线程-就是开始于main()方法的那个,是非守护线程。当该程序中的所有非守护线程都终止时,虚拟机实例将自动退出。
2.java虚拟机的体系结构
类装载子系统,执行引擎,运行时数据区 (方法区,堆,java栈,pc寄存器,本地方法栈)。每个java虚拟机实例都有一个方法区以及一个堆,它是所有线程共享的。当虚拟机装载一个class文件时,它会从这个class文件包含的二进制数据中解析类型信息,然后把类型信息放到方法区中,堆里面放的是对象。
当一个新线程被创建时,它将得到它自己的pc寄存器(程序计数器)以及一个java栈,pc寄存器的值总是指示下一条将被执行的指令,而它的java栈则总是存储该线程中java方法的调用状态(包括局部变量,被调用时传进来的参数,它的返回值,以及运算的中间结果)。
3.类装载器子系统
java虚拟机有两种类装载器 :启动类装载器和用户自定义类装载器,
4.方法区
类的类型信息,类型的常量池,字段信息,方法信息,除了常量以外的所有类变量,一个到类classLoader的引用,一个到class类的引用
a。常量池
虚拟机为每个被装载的类型维护一个常量池,所用常量的一个有序集合,
b。字段信息
字段名,字段的类型,字段的修饰符,
c。方法信息
方法名,方法的返回类型,参数的数量和类型,方法的修饰符,方法的字节码,操作数栈和该方法的栈帧中的局部变量区大小,异常表
d。类变量
所有类实例共享的,编译时常量的类型都会复制它的所有常量到自己的常量池中或嵌入到它的字节码流中,
e。指向classloader的引用
每个类型被装载的时候,虚拟机必须跟踪它是由启动类装载器还是由用户自定义类装载器装载的,如果是用户自定义类装载器装载的,那么虚拟机必须在类型信息中存储对该装载器的引用,虚拟机会在动态连接期间使用这个信息。
f。指向class类的引用
对于每一个装载的类型,虚拟机都会相应地为他创建一个java.lang.class类的实例,给出一个class对象的引用,可以通过class类中定义的方法来找出这个类型的相关信息。
g。方法表
是一个数组,它的元素是所有它的实例可能被调用的实例方法的直接引用,包括那些从超类继承过来的实例方法
5.堆
java程序在运行时创建的所有类实例或数据都放在一个堆中,一个java虚拟机实例中只存在一个堆空间,因此所有线程都将共享这个堆。
垃圾收集器 自动回收不再被运行的程序引用的对象所占用的内存,
数组是真正的对象,存储在堆中,
6.程序计数器
每一个线程都有它自己的pc寄存器,是该线程启动时创建的,内容总是下一条将被执行指令的地址。
7.java栈
启动一个新线程时,都会为它分配一个java栈,以帧为单位保存线程的运行状态,虚拟机以帧为单位压栈或出栈,当前执行的方法使用的栈称为当前帧,当前方法所属的类为当前类,当前类的常量池称为当前常量池。在执行方法时,使用这个帧来存储参数,局部变量,中间运算结果等。 java方法两种返回,一个return,一个抛出异常,虚拟机都会将当前帧弹出java栈然后释放掉。
8.栈帧
由局部变量区,操作数栈和帧数据区,
9。本地方法栈
10.执行引擎
11.本地方法接口