目录
1、类加载过程(懒加载方式)
加载 :IO读入字节码文件
验证 :检查字节码正确性
准备 :静态变量赋默认值、分配内存
解析 :静态方法(静态链接),运行期间(动态链接)
初始化 :静态变量赋初始值
使用 --> 卸载
2、类加载器和双亲委派机制
常用类加载器:
启动类加载器:负责加载支撑JVM运行的位于JRE的lib目录下的核心类库,比如 rt.jar、charsets.jar等
扩展类加载器:负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中 的JAR类包
应用程序类加载器:负责加载ClassPath路径下的类包,主要就是加载你自己写 的那些类
自定义加载器:负责加载用户自定义路径下的类包
双亲委派机制(阅读源码) :
先找父加载器,后找子加载器
为什么要设计双亲委派机制?
1、api安全,防止jvm核心类库被修改
2、避免类的重复加载,保证唯一性
3、85%以上的类都来自应用程序类加载器
打破双亲委派
Tomcat为什么要打破双亲委派?以及Tomcat需要解决的问题
1、部署不同程序,依赖不同版本的jar包,此时不能保证类的唯一
2、同一web容器,同一类库同一版本,可以共享
3、web容器自己的类库,不能与容器中的类库混淆
4、jsp修改后类加载器须重启
tomcat的几个主要类加载器:
commonLoader:Tomcat基本的类加载器,加载路径中的class可以被 Tomcat容器本身以及各个Webapp访问;
catalinaLoader:Tomcat容器私有的类加载器,加载路径中的class对于 Webapp不可见;
sharedLoader:各个Webapp共享的类加载器,加载路径中的class对于所有 Webapp可见,但是对于Tomcat容器不可见;
WebappClassLoader:各个Webapp私有的类加载器,加载路径中的class只对 当前Webapp可见;