JVM基础类加载机制

Posted 烟锁迷城

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM基础类加载机制相关的知识,希望对你有一定的参考价值。

1、类加载机制

类加载机制就是class装载到JVM的过程,可以划分为装载,链接,初始化三个阶段。链接都包含验证,准备,解析三个步骤。

1.1、装载

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

1.2、链接

  1. 验证:保证被加载类的正确性,进行文件格式验证,元数据验证,字节码验证,符号引用验证
  2. 准备:为类的静态变量分配内存,并将其初始化为默认值
  3. 解析:把类中的符号引用转换为直接引用。

1.3、初始化

对类的静态变量,静态代码块进行初始化操作。

2、类加载器

类加载器,用来装载类的工具,在java中,不同的类加载器代表不同的加载级别,最顶级的类加载器加载java的核心系统class,然后依次向外延伸,逐渐加载更外围的class

  • Bootstrap ClassLoader:加载$JAVA_HOME中jre/lib/rt.jar里所有的class或Xbootclassoath选项指定的jar包
  • Extension ClassLoader:加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包
  • App ClassLoader:加载classpath中指定的jar包以及Djava.class.path所指定目录下的类和jar包。
  • Custom ClassLoader:通过java.lang.ClassLoader的子类自定义加载Class。属于应用程序根据自身需要自定义的ClassLoader,如tomcat,jboss都会通过j2ee规范自行定义ClassLoader

3、双亲委派

由于装载时的寻找方法是通过类的全限定名,所以一旦全限定名重复,就会造成加载混乱的情况,甚至可能导致java核心系统类被其他外围同名类取代的问题。

为了解决这个问题,类加载器采用了双亲委派模式

如果一个类加载器在接到加载类的请求时,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父类加载器去完成,依次递归,如果父类加载器可以完成类加载任务,就成功返回,只有父类加载器无法完成此加载任务时,才依次向下交给子类加载器加载。

这个模式的优势在于,java类随着加载它的类加载一起具备了一种带有优先级的层次关系,比如java中的String类,它存放在rt.jar之中,无论哪个类加载器要加载这个类,最终都将委派制处于最顶端的Bootstrap类加载器去完成加载,因此在任何环境下,String都是同一个类,不会产生多个String。

如果想要打破双亲委派模型,只需要重写loadclass方法即可。

以上是关于JVM基础类加载机制的主要内容,如果未能解决你的问题,请参考以下文章

java类加载机制

JVM类加载器:双亲委派机制沙箱安全机制

JVM系列:Java类加载机制之双亲委派模型

深度详解JVM类加载机制

JVM17_Tomcat打破双亲委派机制执行顺序底层代码原理Tomcat|JDBC破坏双亲委派机制带来的面试题

JVM笔记二双亲委派机制