JVM类加载机制

类加载器

引导类加载器:负责加载支撑JVM运行的位于JRE的lib目录下的核心类库,比如rt.jar、charsets.jar等
扩展类加载器:负责加载支撑JVM运行的位于JRE的lib下的ext扩展目录下的jar包
应用程序类加载器:负责加载ClassPath路径下的类包,主要是自己写的代码
自定义类加载器:负责加载自定义路径下的类包

类加载运行全过程

1.windows下java.exe调用底层jvm.dll文件创建JVM虚拟机(C++实现)
2.创建一个引导类加载器实例(C++实现)
3.C++调用Java代码创建JVM启动器实例sun.misc.Launcher,该类由引导类加载器负责加载创建其他类加载器
4.获取运行类自己的类加载器ClassLoader,默认是AppClassLoader实例
5.调用loadClass,加载要运行的类
6.加载完成时,JVM会执行类的main方法入口
7.JVM销毁

类加载器初始化

1.sun.misc.Launcher构造方法内部创建了两个类加载器实例,分别是ExtClassLoader和AppClassLoader
2.JVM默认使用Launcher.getClassLoader返回的类加载器AppClassLoader的实例来加载我们的应用程序

双亲委派机制

首先,检查某个类是否加载过,如果加载过,就直接返回
如果某个类没有加载过,再判断一下是否有父加载器,如果有则有父加载器加载或者bootstrap类加载器加载
如果父加载器或者bootstrap类加载器都没有找到该类,则由当前类加载器的findClass方法完成加载
简单来说:就是先由父加载器加载,不行由子加载器加载

为什么设计双亲委派机制?

  • 沙箱安全机制,防止核心API被修改
  • 防止类重复加载,保证相同的类只被加载一次

怎么打破双亲委派机制?

采用自定义类加载器,重写loadClass方法,
而自定义的类加载器,需要集成ClassLoader并实现findClass方法

posted @   进阶中的小王  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示