主要分为4大步:
链接又分为3小步:
类加载器:
- BootstrapClassLoader(启动类加载器)
最顶层的加载类,由C++实现,通常表示为 null,并且没有父级,用来加载JDK核心类库,( %JAVA_HOME%/lib目录下的 jar 包和类)以及被 -Xbootclasspath参数指定的路径下的所有类。
- 扩展类加载器
主要负责加载 %JRE_HOME%/lib/ext 目录下的 jar 包和类以及被 java.ext.dirs 系统变量所指定的路径下的所有类
- 应用类加载器
负责加载当前应用 classpath 下的所有 jar 包和类
类加载机制:双亲委派模型
jvm启动时不会一次性加载全部类,大部分类都是在使用时触发加载,那如何知道当前类是否已经加载过呢?根据双亲委派模型来实现,当需要加载一个类时,首先会由父类加载器中加载(及父类的父类),当父类加载器无法加载时,则调用findClass方法来加载该类;
ps:为了打破双亲委派模型,可以自定义类加载器(继承ClassLoader,重写loadClass()),【tomcat的应用间类隔离原理】