码迷,mamicode.com
首页 > 其他好文 > 详细

JVM 类加载机制

时间:2017-10-23 23:03:38      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:sim   虚拟机   substring   类加载机制   lang   find   移动   protect   文件名   

执行 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>\bin 目录中,并且是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 }

 

JVM 类加载机制

标签:sim   虚拟机   substring   类加载机制   lang   find   移动   protect   文件名   

原文地址:http://www.cnblogs.com/lix-y/p/7623079.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!