面试三十、类加载、双亲委派机制模型
1、类加载
1)将.class文件加载入内存,并对数据进行校验、准备、解析、初始化,
最终形成JVM可使用的JAVA类型的过程。
2)加载:
将.class文件加载入内存,并将这些数据转换成方法区中的运行
数据(静态变量、静态代码块、常量池),在堆中用反射机制生成
一个Class类对象代表这个类,作为方法区数据的访问入口。
3)链接:
将java类的二进制合并入jvm的允许状态中
验证:确保加载的类信息符合规范,没有安全问题
准备:正式为类变量分配内存并设置初始默认值,这些内存在方法区里分配
解析:虚拟机常量池内的符号引用替换为直接引用(地址引用)的过程
4)初始化:
执行构造器<clinit>()方法。类构造器的<clinit>()方法是有编译器收集类里的
所有类变量赋值动作和静态语句块中的语句合并生成。
子类在初始化时,如果发现父类没有初始化,会先对父类进行初始化。
顺序:
父类静态变量
父类静态代码块
子类静态变量
子类静态代码块
父类非静态变量
父类非静态代码块
父类构造方法
子类非静态变量
子类非静态代码块
子类构造方法
2、类加载器
1)分类:
Bootstrap ClassLoader启动类(引导类)加载器:lib/rt下,用了加载java的核心库
Extension ClassLoader扩展类加载器:lib/ext/.*,加载扩展库
Application ClassLoader应用类加载器:根据java应用的类路径加载java类,
一般来说java应用的类都有它来加载
自定义加载器:开发人员可通过继承ClassLoader类来实现自己的加载器
注:ClassLoader可以根据指定的类名,找到或者生成其子节码,然后从这些字节码的代码中
定义出一个Java类,即Class类的一个实例。
2)类加载器代理模式:
双亲委派:某个特定的类加载器接收到加载请求时,会讲加载任务委托给自己的父类加载器,
直到最高级父类引导类加载器,如果父类加载器能加载就加载,不能加载则返回子类加载。
注:这种机制保证了核心库的安全,防止用户自定义如Object类的情况。
3)自定义类加载器 :
继承ClassLoader,重写findClass方法
流程:
先查询请求类型是否已经加载过了,有则直接返回
委托父类,父类加载成功则返回
调用自己实现的加载方法
posted on 2021-09-06 20:16 Iversonstear 阅读(44) 评论(0) 编辑 收藏 举报