1. 类的生命周期
加载->连接(验证->准备->解析)->初始化->使用->卸载
2. 类加载的具体步骤
加载
- 首先通过类的全限定名,来获取到定义这个类的二进制字节流。
- 再将字节流转化为动态的一个数据结构保存到方法区中。
- 把类的class文件读取到内存中,再创建一个java.lang.Class的对象,之后访问这个类的数据时,这个对象就可以作为类的一个访问数据入口。
连接
- 验证:这一步会校验这个类的一个数据信息、文件格式还要字节码是否符合JVM规范,因为他需要和其他类要协调一致。
- 准备:在方法区中给类的一些静态属性分配内存空间,并赋予初始默认值。
- 解析:把类的二进制中的符号引用替换为直接引用,将引用和堆中对象直接关联起来。
初始化
主要对类变量进行一个初始化。这里如果父类还没有初始化,就先初始化父类。要是有初始化语句,就依次执行这些语句。
3. 类加载器
四种类加载器
* 启动类加载器:lib目录下的jar包。
* 扩展类加载器:lib/ext目录下的包。
* 系统类加载器:没有指定加载器的话,就使用默认的Application-ClassLoader。
* 自定义类加载器:自己实现的类加载器。
双亲委派机制
首先加载器拿到先不加载,这里他先检查这个类被加载过没,没加载过的话,内部会对parent进行一个判断,看你是不是null,不是null的话就把这个class文件交给父加载器,这样一直到启动类加载器为止。如果是null,也会直接交给启动类加载器。此时就可以进行加载了,但是也要先判断这个类的类型和我加载的是不是同一个类型,如果不是我要负责的类型,就再交给下一级的加载器。