标签: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 }
标签:sim 虚拟机 substring 类加载机制 lang find 移动 protect 文件名
原文地址:http://www.cnblogs.com/lix-y/p/7623079.html