1. 类初始化和类加载
1.1. 创建对象的过程
分为四步:类加载检查,分配对象内存空间,初始化零值操作,进行必要设置(对象头),执行初始化方法。
类加载:Java 虚拟机在执行到 new 关键字的时候,会先检查对应类是否已加载。如果没有加载,则先执行类加载,然后再执行 new 关键字。
分配内存空间:在堆中分配一段空间给对应对象。
初始化零值操作:给对象的空间内的对应成员初始化为零值(对象头除外)。
进行必要的设置:例如给对象头设置一些信息,类的元数据,对象的年龄,对象的哈希码。
执行初始化方法:执行对应的构造方法。
1.2. 对象的生命周期
对象的生命周期:创建,使用,销毁。
创建:见上文。
使用:例如调用该对象的成员。
销毁:该对象没有被引用了,那么就会被看作垃圾进行回收。
1.3. 类加载器
类加载器:启动类加载器,扩展类加载器,应用程序类加载器。
启动类加载器:加载 Java 核心库里面的类。
扩展类加载器:加载一些扩展的类,例如框架的类。
应用程序类加载器:加载用户自己手动创建的类。
1.4. 双亲委派模型
原则:
- 向上委派
- 向下加载
如果一个类加载器收到了加载类的任务,不会自己先执行,而是往上委派给自己的父类,依次类推,直到委派给最终的父类也就是启动类加载器,然后从启动类加载器开始,判断该类是否被自己加载,是否能进行加载,如果能直接返回即可,如果不能继续往下加载(抛给子类),依次类推。
作用:
1. 保证类的唯一性
向上委派,向下加载的这种方式,保证了一个类不会被重复加载,并且保证的一个类只会被一个类加载器加载。
2. 保证安全性
如果用户自己编写了一些类,类的全限定名与 Java 核心库中的类一致,可能会出现优先加载用户的类,从而间接导致核心类被用户修改了,那么通过向上委派,向下加载的这种方式从上开始加载,保证了类的安全性。
3. 形成了隔离和分层的效果
不同的类加载器负责不同的类,既不会重复加载,而保证了高效性。
4. 简化了类加载流程
向上委派,向下加载的这种方式,保证了一个类只能加载一次并且不同的类加载器负责不同的类,从而简化了流程。
1.5. 类加载的过程
从大体上类加载分为五步:类加载,连接,初始化,使用,卸载。细分又有七步:类加载,验证,准备,解析,初始化,使用,卸载。
类加载:通过类的全限定名找到对应的二进制字节码文件,将该文件转换到内存形成创建对象实例的模板。
验证:验证该二进制字节码是否符合 JVM 规范,例如校验魔术,主版本号等等,具体由:文件格式校验,元数据验证,字节码验证,符号引用验证。
**准备:**给该类的静态变量赋一些初始化值。
解析:将原来的符号引用转为直接引用。
初始化:执行构造器方法,执行父类的静态成员,子类的静态成员,父类的构造方法,子类的构造方法。
**使用:**自己用户使用。
**卸载:**判断该类没有被引用即可卸载,三个方面看。
- 该类里面的所有的实例对象都已经被回收了


