Java虚拟机及程序的生命周期
java命令运行一个java程序时,就启动了一个java虚拟机进程。
java虚拟机进程从启动到终止的过程,称为java虚拟机的生命周期。
导致虚拟机进程结束的情况包括:
1、程序正常结束
2、执行过程中因出现异常或者错误而终止
3、执行了System.exit()方法
4、操作系统错误导致虚拟机进程停止
类的加载、连接和初始化
java虚拟机要使用某个类时,会确保这个类被加载、连接和初始化。
加载:
连接:
验证:
准备:
解析:
初始化:
类的加载
类的加载是指把类的.class文件中的二进制数据读入到内存中,把它放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。
类的加载的最终产品是位于运行时数据区的堆区的Class对象。
Class对象封装了类在方法区内的数据结构,并且向java程序提供了访问类在方法区内的数据结构的接口。
类的加载是由类加载器完成的,可分为两种:
Java虚拟机自带的类加载器,有启动类、扩展类和系统类加载器
用户自定义的类加载器,java.lang.ClassLoader类的子类的实例
加载类遇到错误必须等到首次使用时才会报告。
类的验证
类加载完了之后,就是连接了。连接就是把已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中。
类的准备
在准备阶段,java虚拟机为类的静态变量分配内存,并设置默认的初始值。
类的解析
java会把类的二进制数据中的符号引用替换为直接引用。
直接引用也就是方法区内的内存位置。
类的初始化
初始化阶段java执行类的初始化语句,为类的静态变量赋予初始值。
静态变量的初始化有两种途径:
在静态变量的声明处进行初始化
在静态代码块中进行初始化
静态变量的声明语句,以及静态代码块都被看做类的初始化语句,java虚拟机会按照初始化语句在类文件中的先后顺序来依次执行它们。
java虚拟机初始化一个类包含一下步骤
(1)假如这个类还没有被加载和连接,那就先进行加载和连接。
(2)假如类存在直接父类,并且这个父类还没有被初始化,那就先初始化直接的父类。
(3)假如类中存在初始化语句,那就依次执行这些初始化语句。
类的初始化时机
java虚拟机只有在程序首次主动使用一个类或接口时才会初始化它。
对类或接口的主动使用情况包括:
创建类的实例
调用类的静态方法
访问某个类或接口的静态变量,或者对该变量赋值
调用java API中的某些反射方法
初始化一个类的子类
java虚拟机启动时被标明为启动类的类