Java类加载步骤
- 加载:将字节码数据从不同的数据源读取到JVM中,并映射为JVM认可的数据结构;
- 链接:把原始类定义信息平滑的转化入JVM,包括:
- 验证:验证字节信息是符合Java虚拟机规范的。
- 准备:创建类或接口中的静态变量,并初始化静态变量的初始值。
- 解析:将常量池中的符号引用替换为直接引用。
- 初始化:真正执行类初始化的代码逻辑,包括静态字段赋值、执行类定义中的静态初始化块内的逻辑。
双亲委派模型
简单来说就是当类加载器试图加载某个类型的时候,除非父加载器找不到相应类型,否则尽量将这个任务代理给当前加载器的父加载器去做,使用委派模型的目的是避免重复加载Java类型。
Java的类加载器
- 启动类加载器,加载jre/lib下的jar文件,比如rt.jar。
- 扩展类加载器,加载jre/lib/ext/目录下的jar包
- 应用类加载器,加载我们最熟悉的classpath的内容。
如果不同类加载器都自己加载需要的某个类型,那么就会出现多次重复加载,产生资源浪费。
类加载器的特征
- 双亲委派模式。但不是所有的类加载都遵循这个模型。有时候,启动类加载器需要加载用户代码,比如JDK内部的ServiceProvider/ServiceLoader机制,用户可以在标准API框架上提供自己的实现。这时候会使用上下文加载器。
- 可见性。子类加载器可以访问父类加载器加载的类型,反过来不行。
- 单一性。由于父加载器的类型对子加载器可见,所以父加载器加载过的类型,就不会在子加载器中重复加载。
原文
http://yizhanggou.top/javade-lei-jia-zai-guo-cheng-javahe-xin-ji-zhu/