一.类加载机制概述
虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,解析,初始化,最终形成可以被虚拟机直接使用的类型
二.什么情况下类不被加载?
1.通过子类引用父类的静态字段,子类不会被初始化
2.通过数组定义来引用类
3.调用类的常量
三.类加载的过程?
1.加载
(1)通过类的权限定名获取类的二进制流
(2)将这个字节流代表的静态数据结构转化为方法区的运行时数据结构(类比将spring xml中配置的<bean>转化为真正的bean)
(3)在内存中生成一个代表这个类的class对象,作为这个类的各种数据的访问入口
2.连接(和加载的过程并行执行)
(1)验证:确保class文件的字节流中包含的信息符合当前虚拟机的要求
(2)准备:为类变量分配内存并设置初始值(方法区)
(3)解析:解析阶段是虚拟机将常量池中的符号引用替换为直接引用的过程
3.初始化
只有在使用的时候才会被初始化(new 的时候)
四.类加载器分类
启动类加载器:由C++实现,是虚拟机的一部分,用于加载javahome下lib下的类
扩展类加载器:加载javahome下/lib/etc目录下的类
应用程序类加载器:加载用户类路径上所指定的类库
五.双亲委派模型
优点:使java类伴随类加载器具备了带有优先级的层次关系,确保了虚拟机先从最核心的API开始查找,防止不可信的类扮演被信任的类