类的生命周期:
1.加载(读取二进制内容)
2.验证(验证class文件格式规范,语义分析,引用验证,字节码验证)
3.准备(分配内存,设置类static修饰的变量初始值)
4.解析(类,接口,字段,类方法等解析)
5.初始化(为静态变量赋值;执行静态代码块)
6.使用(创建实例对象)
7.卸载(从jvm方法区中卸载)
类加载器负责装入类,搜索网络,jar,zip,文件夹,二进制数据,内存等指定位置的类资源。一个java程序运行,最少有三个类加载器实例,负责不同类的加载。
1.Bootstrap loader核心类库加载器(C/C++实现,加载JRE_HOME/jre/lib目录或者用户配置的目录JDK核心类库)
2.Extension class loader扩展类库加载器,加载JRE_HOME/jre/lib/ext目录,JDK拓展包,或用户配置的目录
3.application class loader用户应用程序类加载器,加载java.class.path指定的目录
类的唯一性:同一个类加载器,类名一样,代表是同一个类。
识别方式:classloader instance id+package name+class name
类中的静态代码块和静态属性是在类第一次创建实例的时候被调用,后面再创建实例则不会再调用。
类卸载:
1.该class所有的实例都已经被GC
2.加载该类的classLoader实例已经被GC
双亲委派模型,为了避免重复加载,由下到上逐级委托,由上到下逐级查找。
首先不会自己尝试加载类,而是把这个请求委派给父加载器去完成;每一个层次的加载器都是如此,因为所有的类加载请求都会传给上层的启动类加载器。
只有当父加载器反馈自己无法完成该加载请求(该加载器的搜索范围中没有找到对应的类)时,子加载器才会尝试自己去加载。