前言
双亲委派模型是一个面试经典题目
类加载
当我们运行java程序时,首先需要将 .java文件经过编译后生成对应 .class文件,然后由 JVM 来加载.class文件到内存中。作为开发人员我们不需要去关心.class文件是如何被加载到 JVM中的,这一切工作都有类加载器去完成。
类的加载过程如图所示:
- 加载,加载分为三步:
1、通过类的全限定性类名获取该类的二进制流;
2、将该二进制流的静态存储结构转为方法区的运行时数据结构;
3、在堆中为该类生成一个class对象;
附jvm内存结构图。 - 验证:验证该class文件中的字节流信息复合虚拟机的要求,不会威胁到jvm的安全;
- 准备:为class对象的静态变量分配内存,初始化其初始值;
- 解析:该阶段主要完成符号引用转化成直接引用;
初始化:到了初始化阶段,才开始执行类中定义的java代码;初始化阶段是调用类构造器的过程;
在第一阶段加载过程中,我们即可以选择使用系统提供的类加载器来完成加载,也可以使用自定义的类加载器来加载。类加载器
在java中,类加载器ClassLoader有四种
- BootStrapClassLoader: c++编写,加载核心库java.*;
- Extension ClassLoader: java编写,加载扩展库javax.*;
- AppClassLoader: java编写,加载程序目录;
- 自定义ClassLoader:java编写,继承自ClassLoader,定制化加载;