zoukankan      html  css  js  c++  java
  • 虚拟机类加载机制

    类加载器

    通过一个类的全限定名来获取描述此类的二进制字节流。 实现这个动作的代码模块成为“类加载器”

    (1).BootStrap ClassLoader:启动类加载器,负责加载存放在%JAVA_HOME%lib目录中的,或者通被-Xbootclasspath参数所指定的路径中的,并且被java虚拟机识别的(仅按照文件名识别,如rt.jar,名字不符合的类库,即使放在指定路径中也不会被加载)类库到虚拟机的内存中,启动类加载器无法被java程序直接引用。

    (2).Extension ClassLoader:扩展类加载器,由sun.misc.Launcher$ExtClassLoader实现,负责加载%JAVA_HOME%libext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。

    (3).Application ClassLoader:应用程序类加载器,由sun.misc.Launcher$AppClassLoader实现,负责加载用户类路径classpath上所指定的类库,是类加载器ClassLoader中的getSystemClassLoader()方法的返回值,开发者可以直接使用应用程序类加载器,如果程序中没有自定义过类加载器,该加载器就是程序中默认的类加载器。

    这里需要注意的是上述三个JDK提供的类加载器虽然是父子类加载器关系,但是没有使用继承,而是使用了组合关系。

    从JDK1.2开始,java虚拟机规范推荐开发者使用双亲委派模式(ParentsDelegation Model)进行类加载,其加载过程如下:

    (1).如果一个类加载器收到了类加载请求,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器去完成。

    (2).每一层的类加载器都把类加载请求委派给父类加载器,直到所有的类加载请求都应该传递给顶层的启动类加载器。

    (3).如果顶层的启动类加载器无法完成加载请求,子类加载器尝试去加载,如果连最初发起类加载请求的类加载器也无法完成加载请求时,将会抛出ClassNotFoundException,而不再调用其子类加载器去进行类加载。

    双亲委派 模式的类加载机制的优点是java类它的类加载器一起具备了一种带优先级的层次关系,越是基础的类,越是被上层的类加载器进行加载,保证了java程序的稳定运行。双亲委派模式的实现:

    protected synchronized Class<?> loadClass(String name, Boolean resolve) throws ClassNotFoundException{ 
    
    //首先检查请求的类是否已经被加载过 
    Class c = findLoadedClass(name); 
    if(c == null){ 
    try{ 
    if(parent != null){//委派父类加载器加载 
    c = parent.loadClass(name, false); 
    } 
    else{//委派启动类加载器加载 
    c = findBootstrapClassOrNull(name); 
    } 
    }catch(ClassNotFoundException e){ 
    //父类加载器无法完成类加载请求 
    } 
    if(c == null){//本身类加载器进行类加载 
    c = findClass(name); 
    } 
    } 
    if(resolve){ 
    resolveClass(c); 
    } 
    return c; 
    }
  • 相关阅读:
    POJ3264 线段树模板
    Dijkstra算法模板 C++
    POJ 1287 Prim算法模板
    ZOJ 2107 Quoit Design(分治法解最近对模板题)
    POJ 3714 Raid 分治法求最近对问题
    最长上升子序列(LIS)及其优化O(nlongn)
    PAT1146 Topological Order
    PAT甲级 _A+B Format
    PAT乙级_A+B与C
    PAT乙级_继续3n+1猜想
  • 原文地址:https://www.cnblogs.com/zhimingxin/p/7644459.html
Copyright © 2011-2022 走看看