类的生命周期
1.加载
- 找到.class文件,获取定义此类的二进制字节流
- jvm读取.class文件中的信息和数据,把这些信息和数据转化到内存方法区中
- 在内存中生成一个与该类相关的一个类对象,运行时类的实例
- Class:也是一个类,是一个特殊的类,用来描述类信息的一个类
2.验证
- 文件格式验证
- 元数据验证
- 字节码验证
- 符号引用验证
3.准备
1.如果java文件中有static修饰的变量,那么在这个阶段,jvm就开始为它分配内存,以及对它进行初始化值
比如:
public static int num=123;//这里的num不是一步到位,分成两个阶段完成(准备和类初始化),在准备阶段只是分配了内存,并且分配一个默认值num=0;在初始化阶段才会赋值123.
对于static final类型,在准备阶段会直接赋予正确的值,因为它是常量。
4.解析
把常量池内的符号引用替换为直接引用
String a=b;
把b的引用地址直接给到a的身上
验证,准备,解析可以统称为链接
5.初始化:这里指类的初始化
- 把在准备阶段的类变量赋予正确的值,执行静态代码块的内容(类初始化代码块)
- 判断有没有子类,如果有子类,保证子类的父类要先被初始化
- 当访问一个静态域时,只有真正声明这个域的类才会被初始化。如当通过子类引用父类的静态变量,不会导致子类初始化。
- 引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)
6.使用
平常对类的一些使用
7.卸载
由垃圾回收机制来实现
类加载器
类的生命周期跟类的加载器有关
类加载器负责将.class文件加载到内存中,并生成对应的java.lang.class类对象
类加载器得到分类:
1.启动类加载器:靠本地方法(c,c++)把jdk/jre/lib包下面的jar包加载到内存中
2.扩展类加载器
3.系统类加载器
理解为程序员自定义的类,由系统类加载器加载到内存中
双亲委派:指类加载器之间的关系
1.扩展类加载器是系统类加载器的父类
2.扩展类加载器和系统类加载器也是由启动类加载器间接实现的
三个加载器的执行流程:
1.最先启动启动类加载器,就启动这一个就搞定了
2.启动类加载器不满足的时候,开始启动扩展类加载器
3.如果前面两种都不满足,启动系统类加载器,把我们自定义的类加载到内存中
public class ClassLoaderTest {
public static void main(String[] args) throws ClassNotFoundException {
//获得系统的类加载器
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
//获得系统的类加载器的父类(拓展类加载器)
ClassLoader parent = classLoader.getParent();
//获得拓展类加载器的父类(启动类加载器)
ClassLoader parent1 = parent.getParent();
//加载类 还没有进入准备阶段
classLoader.loadClass("thread.Productor");
//准备阶段并分配内存 方法区
Class<?> forName = Class.forName("thread.Productor");
//测试当前类是由哪个加载器加载的
ClassLoader classLoader1 = Class.forName("thread.Productor").getClassLoader();
System.out.println(classLoader1);
System.out.println(forName);
System.out.println("加载");
}
}
class Productor{
private String name;
private int age;
public Productor() {
}
public Productor(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Productor{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}