类加载机制

深入理解类加载机制

学习链接  http://hammer.coding.me/2016/10/26/jvm-1/

一、类的加载:        

        JVM将class文件字节码文件加载到内存中, 并将这些静态数据转换成方法区中的运行时数据结构,在堆(并不一定在堆中,HotSpot在方法区中)中生成一个代表这个类的java.lang.Class 对象,作为方法区类数据的访问入口。

过程 (类的生命周期):

         JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,其中加载、检验、准备、初始化和卸载这个五个阶段的顺序是固定的,而解析则未必。为了支持动态绑定,解析这个过程可以发生在初始化阶段之后。

二、类加载器:

把类加载阶段的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作交给虚拟机之外的类加载器来完成。这样的好处在于,我们可以自行实现类加载器来加载其他格式的类,只要是二进制字节流就行,这就大大增强了加载器灵活性。系统自带的类加载器分为三种:

  1. 启动类加载器。
  2. 扩展类加载器。
  3. 应用程序类加载器。

双亲委派模型


 虚拟机划分
a. 从虚拟机角度划分
1.启动类加载器(Bootstrap ClassLoader),由 C++ 语言实现,是虚拟机自身的一部分
2.其它的类加载器,由 Java 语言实现,独立于虚拟机外部,全继承自抽象类 java.lang.ClassLoader
b. 从 Java 开发人员角度划分
1.启动类加载器
2.扩展类加载器
3.应用程序类加载器
4.自定义类加载器(如果有必要,可以自定义)


 双亲委派模型
约束:双亲委派模型要求除了顶层的启动类加载器之外,其余的类加载器都应当有自己的父类加载器。类加载器之间的父子关系一般不以继承关系实现,而是使用组合关系来复用父加载器的代码
工作过程:类加载器收到一个类加载的请求,自己不会先加载,而是把该请求委派给父类加载器,每一层的类加载器都是如此,因此最终该请求会被传送到顶层的启动类加载器中,只有当父类加载器无法完成加载请求(对应搜索范围内没有找到所需的类)时,子加载器才尝试自己去加载
好处:双亲委派模型可以保证系统中的类在各种类加载器环境中都是同一个类,即使用户自定义一个和系统同名的类,也不能被类加载器加载,保证了 Java 程序的稳定运作,因为无论哪一个类加载器要加载一个类,最终都是委派给最顶端的启动类加载器进行加载


破坏双亲委派模型
双亲委派模型不是强制性的约束模型,Java 中大部分的类加载器都遵循这个模型,但是有例外
1.双亲委派模型是在 JDK 1.2 之后引入的,类加载器是在 JDK 1.0 就已经存在。所以在 JDK 1.2 之前,用户可用继承 java.lang.ClassLoader 去重写 loadClass() 方法
2.当基础类要调用用户的代码时,父类加载器可以请求这类加载器去完成类加载的动作
3.对程序动态性的追求,如:代码热替换、代码热部署等
 

 

 

 



 

 

 

你可能感兴趣的:(类加载机制)