标签:
一、概述
JVM把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是JVM的类加载机制
二、类加载过程
加载—(验证—准备—解析)(连接Linking)—初始化—使用—卸载
1、“加载”是“类加载”的第一个阶段,JVM需要完成以下3件事情:(1)通过一个类的全限定名来获取定义此类的二进制字节流;(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;(3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
2、验证是连接阶段的第一步,目的:确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。
大致会完成4个阶段的验证动作:文件格式验证,元数据验证,字节码验证,符号引用验证。
3、准备 正式为类变量分配内存闭并设置类变量的初始化值得阶段。
4、解析 JVM将常量池内的符号引用替换为直接引用的过程。
5、初始化 真正开始执行类中定义的java程序代码(或者说是字节码)
类加载器
一个类在jvm中的唯一性由加载它的类加载器和这个类本身一同确立。换句话说就是,比较两个类是否相等,只有在这两个类是由同一个类加载器加载的前提下才有意义。
从java开发人员的角度来看,类加载器的划分为一下3种:
(1)启动类加载器
(2)扩展类加载器
(3)应用程序类加载器
类加载器的双亲委派模型:模型见下图。要求除了顶层的启动器外,其余的类加载器都应邮资机的父类加载器。过程:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的来加载器都是如此,因此所有的类加载请求最终都应该传送到顶层的启动类加载器,只有当父类加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)的时候,子加载器才会尝试自己去加载。
使用这种模型的好处:java类随着它的来加载器一起具备了一种带有优先级的层次关系,对于保证java程序的稳定运作很重要,代码集中在java.lang.ClassLoader的loadClass()方法中。
标签:
原文地址:http://www.cnblogs.com/leeplogs/p/5879673.html