类加载机制123
类加载机制:
1.全盘负责 类加载器加载某个类时,该类所依赖和引用其它的类也由该类加载器载入
2.双亲委派机制
BootstrapClassLoader:负责加载标准库中的类
ExtensionClassLoader:负责加载 JVM 扩展库中的类
ApplicationClassLoader:负责加载用户提供的第三方库/用户项目代码中的类
这三个加载器彼此存在“父子类”的关系:
BootstrapClassLoader 相当于 ExtensionClassLoder 的父加载器,ExtensionClassLoder 相当于 ApplicationClassLoder 的父加载器。
标准库的类
BootstrapClassLoader
||
||
jvm扩展库的类
ExtensionClassLoder
||
||
用户提供的第三方库(依赖) 和 用户开发编写的类
ApplicationClassLoder
双亲委派模型就是单加载一个类时,首先从 ApplicationClassLoader 开始,但 ApplicationClassLoader 会把加载任务交给父加载器 ExtensionClassLoader , ExtensionClassLoader 又会把加载任务交给父加载器 BootstrapClassLoader
双亲委派模型就是单加载一个类时,
首先从 ApplicationClassLoader 开始,但 ApplicationClassLoader 会把加载任务交给父加载器 ExtensionClassLoader , ExtensionClassLoader 又会把加载任务交给父加载器 BootstrapClassLoader
BootstrapClassLoader没有父加载器才开始搜索标准库目录的类,找到了就加载,没找到就交给子加载器 ExtensionClassLoader,
ExtensionClassLoader 搜索扩展库的目录,找到了就加载,没找到就交给子加载器 ApplicationClassLoader,
ApplicationClassLoader 搜索用户项目相关目录,找到了就加载,没找到就抛出异常。
双亲委派模型的 加载顺序确保了 BootstrapClassLoader 先加载,ApplicationClassLoader 后加载,可以避免因用户自己写的类导致 JVM 已有代码的混乱。
3.缓存机制 缓存机制保证所有加载过的class都会被缓存,
当程序中需要某个类时,先从缓存区中搜索,
如果不存在,才会读取该类对应的二进制数据,并将其转换成class对象,存入缓存区中。
这就是为什么修改了class后,必须重启JVM,程序所做的修改才会生效 的原因。