深入理解Java虚拟机(8)
来源:互联网 发布:绿盾加密软件 编辑:程序博客网 时间:2024/06/09 20:57
这个系列文章是对《深入理解Java虚拟机》一书的笔记及个人理解
类加载器用于实现类的加载动作。对于任意一个类,需要由类加载器及类本身一同确立其在Java虚拟机中的唯一性。通俗地说就是同一个类加载器的加载范围内,类只会被加载一次,但在不同的类加载器中,类会被多次加载。
类加载器分为两种:
启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现,是虚拟机的一部分,启动类加载器无法被Java程序直接引用。
其它类加载器,这些类加载器都由Java语言实现,独立于虚拟机外部,并且全部继承自抽象类 java.lang.ClassLoader。
其它类加载器中有两个非常重要的代表。
扩展类加载器(Extension ClassLoader),负责加载$JAVA_HOME/lib/ext目录下的类库
应用程序类加载器(Application ClassLoader),这个类加载器是ClassLoader类中getSystemClassLoader方法的返回值,所以也称为系统类加载器。负责加载用户类路径(ClassPath)上所指定的类库。如果应用程序中没有自定义过其它类加载器,一般情况下这个就是默认的类加载器。
双亲委派模型
在类加载器之间,设计有一种层次关系,称之为双亲委派模型。
模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器(类加载器之间的父子关系并不是以继承的关系来实现,而是以组合的关系来实现)。
模型的工作过程是:
类加载器收到类加载的请求,它首先不是自己去尝试加载,而是将这个类委派给父类加载器去完成,中间每一个层次的类加载器都是这么做的,因此所有的加载请求最终都应该传送到顶层的启动类加载器,只有当父加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载。
破坏双亲委派模型的场景
1、 线程上下文类加载器
这个类加载器可以通过Thread类的setContextClassLoader()方法进行设置,如果创建线程时还未设置,它将会从父线程中继承一个,如果应用程序全局范围内都没有设置过,那么这个类加载器默认就是应用程序类加载器。
有了这个类加载器,可以实现父类加载器请求子类加载器去完成类加载的动作,这种行为实际上就是打通了双亲委派模型的层次结构,逆向使用类加载器。
2、代码热替换、程序热部署
- 深入理解Java虚拟机(8)
- 深入理解java虚拟机
- Java虚拟机 深入理解
- 深入理解Java虚拟机
- 深入理解java虚拟机
- 深入理解Java虚拟机
- 深入理解java虚拟机
- 《深入理解java》虚拟机
- 《深入理解java虚拟机》
- 深入理解Java虚拟机
- 深入理解JAVA虚拟机
- 深入理解java虚拟机
- 深入理解Java 虚拟机
- 深入理解java虚拟机
- 深入理解Java虚拟机
- 深入理解JAVA虚拟机
- 深入理解Java虚拟机
- 深入理解Java虚拟机
- Mysql安装时报'Install' for product 'MySQL Server xxx' failed
- 关于Element的textarea自适应高度
- fragment详解
- C++——操作符重载
- 用yum下载安装gcc
- 深入理解Java虚拟机(8)
- uiautomator点击不同对话框按钮--正则表达式
- 第15节:scala编程之类型参数
- Linux 下的 ActiveMQ C++ 客户端开发
- 一起用C#写个行列式计算器
- hadoop-mapreduce
- 裂墙干货之jieba,wordcloud,nltk下载及安装
- idea创建maven项目
- 20171115_工作记录