十二、java知识点——类加载机制(硬货)

1、类加载过程有5步,如图:

1)、加载:分为预加载、运行时加载;
   预加载:虚拟机启动时加载,加载的是JAVA_HOME/lib/下的rt.jar下的.class文件;
   运行时加载:将用到的类的class对象加载到内存中;
2)、验证:确保Class文件的字节流中包含信息符合当前虚拟机要求,不会危害虚拟机自身安全。 主要包括四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证;

3)、准备:为类变量(即static修饰的字段变量)分配内存并且设置该类变量的初始值为0
4)、解析:虚拟机将常量池内的符号引用替换为直接引用的过程;
   符号引用(编译之后的UTF-8就是符号引用):一组符号来描述目标,可以是任何字面量;
   直接引用:直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。有类或接口的解析,字段解析,类方法解析,接口方法解析
5)、初始化:给static变量赋值以及执行静态代码块。

2、类加载器

1)、引导(Bootstrap)类加载器(C++语言实现):
   主要加载的是JVM自身需要的类,负责将 /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类的方式实现自己的类加载器,以满足一些特殊的需求。

3、双亲委派机制:
  工作原理如果一个类加载器收到了类加载请求, 它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行, 如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归, 请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回, 倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式。

优缺点:
   好处:
  1)、Java类随着它的类加载器一起具备了一种带有优先级的层次关系, 通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次;
  2)、保证java核心库的安全性,java核心api中定义类型不会被随意替换。


觉得不错,欢迎给一个赞!谢谢!

你可能感兴趣的:(java,运维,c/c++)