双亲委派模型
为何需要双亲委派模型:
如果你自己重写一个String类, 会发生什么?两个字:安全
JVM运行流程, JVM基本结构
类加载器双亲委派模型
classLoader源码解析
从源码分析实现自定义类加载器
JVM的运行流程
class字节码文件:java源程序->编译成字节码文件[ 通过javac编译 ]-> JVM [ 内存 ] ->最终保存在堆里面去了 JVM跨平台 JVM解释成本地机器指令
jvm基本结构:
类加载器、 执行引擎、运行时数据区、 本地接口、
class Files -> classLoader ->运行时数据区 -> 执行引擎 -> 本地库接口 --> 本地方法库
classLoader把class文件放到运行时数据区:
类的装载:加载 连接(验证, 准备, 解析), 初始化类对象 实例化使用类对象 , 卸载
类的定义或者结构 保存在堆中
初始化:执行类的<clinit>,为静态变量赋予正确的初始值
构造器: 构造的是class
1、 static变量 2、static语句 3、
构造方法, 实例化对象
类加载器就是把class对象加载到运行时数据区
双亲委派模型, 类加载的时候必须要先通过父类加载器去加载, bootstrap类加载器不是, 其他的类加载器都有父类加载器
bootstrap 启动类加载器, 其他类加载器都是继承自ClassLoader
双亲委派模型工作过程是:如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器完成。每个类加载器都是如此,只有当父加载器在自己的搜索范围内找不到指定的类时(即ClassNotFoundException),子加载器才会尝试自己去加载。
为什么要使用双亲委派模型 :
避免类的重复加载, 父类已经加载了,子类就没有必要再加载一次
String根类加载器去加载
classLoader
BootstrapClassLoader -> rt.jar JVM内核中 用null表示
ExtensionClassLoader -> %javaHome%lib/ext/*.jar
AppClassLoader -> classpath
自定义类加载器 -》 完全自定义加载路径
JVM之执行引擎:
一次性解释字节码
即时编译器
自适应优化器 一个自适应的优化器可以使得java虚拟机在80%-90%的时间里执行被优化过的代本地代码
如果您喜欢我的文章,欢迎关注我的公众号