博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM类加载过程 & 双亲委派模型
阅读量:6989 次
发布时间:2019-06-27

本文共 1201 字,大约阅读时间需要 4 分钟。

JVM类加载过程 & 双亲委派模型

声明

文章均为本人技术笔记,转载请注明出处

类加载过程

类加载机制:JVM将类描述数据从.class文件中加载到内存,并对数据进行,解析和初始化,最终形成被JVM直接使用的Java类型。

——《深入理解Java虚拟机 JVM高级特性与最佳实践》

截图来自《Java虚拟机精讲》

  • 加载:加载阶段由类加载器负责,过程见类加载器;

  • 验证:验证阶段负责验证类数据信息是否符合JVM规范,是否是一个有效的字节码文件;

  • 准备:准备阶段负责为类中static变量分配空间,并初始化(与程序无关,系统初始化);

  • 解析:解析阶段负责将常亮池中所有符号引用转换为直接引用;

  • 初始化:初始化阶段负责将所有static域按照程序指定操作对应执行(赋值static变量,执行static块)

上述阶段通常都是交叉混合允许,没有严格的先后执行顺序;


类加载器

<span id = "jump"></span>类加载器的主要任务:是类加载过程中的加载操作根据一个类的全限定名读取该类的二进制字节流到JVM内部,然后转换为一个对应的java.lang.Class对象实例

开发者可以通过编写自定义类加载器来自定义类的加载规则

类加载器分类

启动类加载器/Bootstrap ClassLoader

在HotSpot虚拟机中,Bootstrap ClassLoader用C++语言编写并嵌入JVM内部,主要负载加载JAVA_HOME/lib目录中的所有类,或者加载由选项-Xbootcalsspath指定的路径下的类;

拓展类加载器/ExtClasLoader

ExtClassLoader继承ClassLoader类,负载加载JAVA_HOME/lib/ext目录中的所有类型,或者由参数-Xbootclasspath指定路径中的所有类型;

应用程序类加载器/AppClassLoader

ExtClassLoader继承ClassLoader类,负责加载用户类路径ClassPath下的所有类型,一般情况下为程序的默认类加载器;

自定义加载器

Java虚拟机规范将所有继承抽象类java.lang.ClassLoader的类加载器,定义为自定义类加载器


双亲委派模型

截图来自《Java虚拟机精讲》

截图来自http://blog.csdn.net/zhangliangzi/article/details/51338291

双亲委派过程:当一个类加载器收到类加载任务时,立即将任务委派给它的父类加载器去执行,直至委派给最顶层的启动类加载器为止。如果父类加载器无法加载委派给它的类时,将类加载任务退回给它的下一级加载器去执行;

除了启动类加载器以外,每个类加载器拥有一个父类加载器,用户的自定义类加载器的父类加载器是AppClassLoader;
双亲委派模型可以保证全限名指定的类,只被加载一次;
双亲委派模型不具有强制性约束,是Java设计者推荐的类加载器实现方式;


参考

[1] 《Java虚拟机精讲》

[2] 《深入理解Java虚拟机 JVM高级特性与最佳实践》
[3]   

你可能感兴趣的文章
医院启用智能结构化电子病历
查看>>
Python发送各类邮件的主要方法
查看>>
nginx同一端口监听多个域名和同时监听http,https
查看>>
关于win7系统的设置文件共享与远程连接的步骤整理
查看>>
每天一个linux命令(11):nl命令
查看>>
Apache2.2+tomcat负载均衡session共享配置说明手册1.1版
查看>>
PHP 5.3.0以上推荐使用mysqlnd驱动
查看>>
vue.js中使用d3.js画家谱关系图
查看>>
python实现跨文件全局变量的方法
查看>>
grails的那个编码,老是忘记,记这里。。。。。
查看>>
禁用arcgis security service
查看>>
火狐ssl_error_weak_server_ephemeral_dh_key解决办法
查看>>
Exchange DAG error
查看>>
Windows7安全性的五件应该知道的事
查看>>
ON CONFLICT子句
查看>>
Delphi对保存数据库连接信息的Ini文件的操作类
查看>>
大数相加
查看>>
简单的nginx服务脚本
查看>>
现实社会做点事情真难~难~难~难
查看>>
Docker 完全指南
查看>>