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

    执行 java **.class    Java.exe 去JRE在内部找到jvm.dll, 激活虚拟机 

    类加载过程:

      Loading 

        将磁盘中的.class文件移动到内存中, 叫做“加载”;

        通过一个类的全限定名来获取描述此类的二进制字节流;  将这个字节流代表的静态存储结构转化为方法的运行时数据结构;  在Java堆中生成一个java,lang.Class对象,作为方法区数据的访问入口。

      验证

        确保Class文件的字节流包含的信息符合当前虚拟机规范。

        准备  

        在方法区中为类变量(static) 分配内存并设置类变量初始值(数据类型的0值,或static final 修饰的常量给定值)。

      解析

        针对 类、接口、方法、字段, 将常量池内的符号引用替换为直接引用的过程

          符号引用 与虚拟机实现的内存布局无关,引用目标不一定加载到内存中; 直接引用 与内存布局有关,引用的目标必定在内存。

      初始化

        执行类构造器<clinit>()方法的过程

          <clinit>方法由所有类变量的赋值以及静态语句块中的语句产生,非必需;

           虚拟机保证在子类的<clinit>()方法执行之前父类的<clinit>()方法已经执行完毕。 因此第一个被执行的<clinit>()方法的类一定是java.lang.Object;

          接口的实现类在初始化时不会执行接口的<clinit>()方法;

          如果多个线程同时初始化一个类,那么只会有一个线程去执行<clinit>()方法,其它线程阻塞等待。

    类加载器 

    一个类 由它本身和加载它的类加载器来唯一确定

     1 // 自定义的类加载器
      public Class<?> loadClass(String name) throws ClassNotFoundException { 2 try { 3 String classSimpleName = name.substring(name.lastIndexOf(".") + 1) + ".class"; 4 InputStream is = getClass().getResourceAsStream(classSimpleName); 5 6 if (is == null) 7 return super.loadClass(name);
    8 byte[] b = new byte[is.available()]; 9 is.read(b); 10 return defineClass(name, b, 0, b.length); 11 } catch (Exception e) { 12 throw new ClassNotFoundException(); 13 } 14 ... 15 }

     详细过程

      读取系统参数进行初始化,并产生第一个类装载器Bootstrap Loader(启动类装载器)

    ·  BL继续初始化,并加载扩展类ExtClassLoader(扩展类装载器),然后再加载AppClassLoader(应用程序类装载器 

    类装载器体系

      启动类装载器:

        在系统类<JAVA_HOME>in 目录中,并且是VM按照文件名识别的(如:rt.jar),由c++实现,是JVM实现的一部分。

      扩展类装载器和应用程序类装载器:

        装载除Java核心API的class文件,也是JVM实现的一部分。

    Parents Delegation Model

      使用组合关系复用父加载器的代码;

      所有的加载请求都传递给顶层的启动类加载器中,只有父加载器无法完成该请求,子加载器才会尝试自己去加载。

     1 // 双亲委派模型的实现
     2 
     3 protected synchronized Class<?> loadClass(String nama, boolean resolve) throws ClassNotFoundException {
     4     // 检查请求的类是否已被加载过
     5     Class c = findLoadedClass(name);
     6     if (c = null) {
     7         try {
     8             if (parant != null) 
     9                 c = parent.loadClass(name);
    10             else
    11                 c = findBootstrapClassOrNull(name);
    12         } catch (ClassNotFoundException e) {
    13             //  父类加载器抛出类找不到异常
    14         }
    15         
    16         if( c === null) {
    17             // 子类尝试加载
    18             c = findClass(name);
    19         }
    20     }
    21     
    22     if (resolve)
    23         resolveClass(c);
    24     return c;
    25 }
  • 相关阅读:
    相对路径与绝对路径总结
    java.lang.ClassNotFoundException: org.apache.commons.dbutils.ResultSetHandle
    navicat建立本地连接出错解决
    JSP基础知识补充
    新建ASPX页面,并练习div布局和table布局
    .net和ASP.net,c#的区别
    char、varchar、nchar、nvarchar四种类型
    WebContent下新建目录放入jsp,跳转servlet页面出错解决
    设计模式(4)----抽象工厂模式
    设计模式(3)----工厂方法模式
  • 原文地址:https://www.cnblogs.com/lix-y/p/7623079.html
Copyright © 2011-2022 走看看