一、类加载过程有5步,如图:
java
1)、加载:分为预加载、运行时加载;
预加载:虚拟机启动时加载,加载的是JAVA_HOME/lib/下的rt.jar下的.class文件;
运行时加载:将用到的类的class对象加载到内存中;
2)、验证:确保Class文件的字节流中包含信息符合当前虚拟机要求,不会危害虚拟机自身安全。 主要包括四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证;
3)、准备:为类变量(即static修饰的字段变量)分配内存而且设置该类变量的初始值为0
4)、解析:虚拟机将常量池内的符号引用替换为直接引用的过程;
符号引用(编译以后的UTF-8就是符号引用):一组符号来描述目标,能够是任何字面量;
直接引用:直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。有类或接口的解析,字段解析,类方法解析,接口方法解析
5)、初始化:给static变量赋值以及执行静态代码块。
api
二、类加载器 安全
1)、引导(Bootstrap)类加载器(C++语言实现):
主要加载的是JVM自身须要的类,负责将 <JAVA_HOME>/lib路径下的核心类库或-Xbootclasspath参数指定的路径下的jar包加载到内存中 只加载包名为java、javax、sun等开头的类;
2)、扩展(Extension)类加载器(Java语言实现、ExtClassLoader类):
用来加载 Java 的扩展库(jre/ext/*.jar); 3)、系统(System)类加载器(也称应用类加载器、AppClassLoader):
负责加载系统类路径java -classpath或-D java.class.path 指定路径下的类库, 是程序中默认的类加载器, 经过ClassLoader#getSystemClassLoader()方法能够获取到该类加载器;
4)、自定义类加载器(custom class loader):
经过继承 java.lang.ClassLoader类的方式实现本身的类加载器,以知足一些特殊的需求。
三、双亲委派机制:
工做原理若是一个类加载器收到了类加载请求, 它并不会本身先去加载,而是把这个请求委托给父类的加载器去执行, 若是父类加载器还存在其父类加载器,则进一步向上委托,依次递归, 请求最终将到达顶层的启动类加载器,若是父类加载器能够完成类加载任务,就成功返回, 假若父类加载器没法完成此加载任务,子加载器才会尝试本身去加载,这就是双亲委派模式。
优缺点:
好处:
1)、Java类随着它的类加载器一块儿具有了一种带有优先级的层次关系, 经过这种层级关能够避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次;
2)、保证java核心库的安全性,java核心api中定义类型不会被随意替换。
spa
以为不错,欢迎给一个赞!谢谢!指针