类加载机制

  1. 类加载机制的概念

类加载机制就是就是把class文件变成虚拟机可以直接使用的java类型的过程。具体过程是从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。

   2.类加载的过程

类从被加载到虚拟机内存中开始,到卸载出内存位置,整个生命周期包括:加载、验证、准备、解析、初始化、使用、卸载。

       其中类加载过程包括加载、链接、初始化。

加载

由类加载器完成,做的事情有3个①根据权限定名获取此类的二进制字节流; ②将这个字节流代表的静态存储结构转化为方法区的运行时数据结构;③在内存中生成一个代表这个类的Class对象,作为方法区这个类的各种数据的访问入口。

链接

验证

检查待加载的class文件的正确性。格式检查(是否是class文件、) 元数据检查(是否继承了final的类,是否实现了接口中的所有方法) 符号引用验证(访问性 private protected)

准备

在方法区内为类中的静态变量分配存储空间。

解析

将虚拟机常量池中的符号引用替换为直接引用的过程。

初始化

如果该类具有超类,则对其初始化,执行静态初始化和静态初始化块。

       3.类加载的分类

类加载的方式分为隐式加载与显示加载两种。隐式加载指的是程序使用new关键字创建对象,则会隐式地调用类的加载器把对应的类加载到JVM中。显示加载指的是直接通过使用class.forName()方法来把所需的类加载到JVM中。

       4. 类加载的特点

在java语言中,类的加载是动态的,当程序启动时只把需要的类加载到JVM中,其他类只有被用的时候才会被加载到虚拟机中。好处是可以加快加载的速度,而且可以节约运行时对内存的开销。

       5. 类加载器      

虚拟机设计团队把类加载阶段的“通过一个类的权限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己去决定如何加载所需要的类,实现这个动作的代码模块称为“类加载器”。

       类加载器的双亲委派模型在JDK1.2期间被引入并被广泛应用于之后几乎所有的java程序中,但它并不是一个强制性的约束模型,而是java设计者推荐给开发者的一种类加载器实现方式。

6.双亲委派模型

双亲委派模型的工作过程:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是会把这个加载的请求委派给父类加载器去完成,每一个层次的类加载器都是这么做,只有当父类加载器无法完成类的加载工作时,子类加载器才会尝试自己去加载这个类。

       使用双亲委派模型来组织类加载器之间的关系的一个好处是就是Java类随着它的加载器一起具备了一种带有优先级的层次关系,保证了java程序的稳定性。

双亲委派模型的类图如下:



  • 启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将 <Java_Runtime_Home>/lib下面的类库加载到内存中(比如rt.jar)。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。
  • 标准扩展(Extension)类加载器:是由 Sun 的 ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的。它负责将< Java_Runtime_Home >/lib/ext或者由系统变量 java.ext.dir指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。
  • 系统(System)类加载器:是由 Sun 的 AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的。它负责将系统类路径(CLASSPATH)中指定的类库加载到内存中。开发者可以直接使用系统类加载器。

7. 类加载器的工作过程代码如下:

public static void main(String[] args){
		/*调用TestLoader的类加载器*/
		ClassLoader calApp = TestLoader.class.getClassLoader();
		System.out.println(calApp);
		/*调用上一层次的类加载器*/
		ClassLoader clExt = calApp.getParent();
		System.out.println(clExt);
		/*调用根部Class加载器,根部加载器是返回null*/
		ClassLoader clBoot = clExt.getParent();
		System.out.println(clBoot);
	}

输出为:


附加上另外看到的针对双亲委派模型的几个问题:

http://www.cnblogs.com/lanxuezaipiao/p/4138511.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值