双亲委派模型

2019-07-11  本文已影响0人  wilkSon

为何需要双亲委派模型:

    如果你自己重写一个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%的时间里执行被优化过的代本地代码

如果您喜欢我的文章,欢迎关注我的公众号

上一篇 下一篇

猜你喜欢

热点阅读