哈喽!大家好,我是【学无止境小奇】,一位热爱分享各种技术的博主!

⭐【学无止境小奇】的创作宗旨:每一条命令都亲自执行过,每一行代码都实际运行过,每一种方法都真实实践过,每一篇文章都良心制作过。✊✊✊

⭐【学无止境小奇】的博客中所有涉及命令、代码的地方,除了提供图片供大家参考,另外会在图片下方提供一份纯文本格式的命令或者代码方便大家粘贴复制直接执行命令或者运行代码。

⭐如果你对技术有着浓厚的兴趣,欢迎关注【学无止境小奇】,欢迎大家和我一起交流。


❤️❤️❤️感谢各位朋友接下来的阅读❤️❤️❤️



文章目录

一、JVM类加载机制

1、 Java类加载运行过程

1.1、大体过程


1.java.exe调用底层的jvm.dll文件创建java虚拟机(c++实现)
2.创建一个引导类加载器实例(c++实现)
3.调用JVM启动器sum.misc.Launcher,该类由引导类加载器负责加载创建其它类加载器。


1.2、加载过程


1.加载:从磁盘中将数据加载到内存中。
2.验证:验证字节码文件格式是否正确。
3.准备:将静态变量赋值默认值。
4.解析:将符号引用替换为直接引用,例如将main()替换为指向数据内存所在地址的指针,这就是所谓的静态链接(类加载期间完成),动态链接是在程序运行期间将符号引用替换为直接引用。
5.初始化:将静态变量赋值为指定的值,执行静态代码块。


1.3、加载方式


懒加载:用到某个类的时候才会加载。例如Student stu = new Student();这个时候才会加载Student类,如果只是Student stu = null;则不会加载Student类。


2、 类加载器和双亲委派机制

2.1、类加载器


1.引导类加载器:负责加载位于JRE的lib目录下的核心类库,比如rt.jar,charsets.jar等。
2.扩展类加载器:负责加载JRE的lib目录下的ext扩展目录中的jar类包。
3.应用程序类加载器:负责加载ClassPath路径下的类包,主要就是加载你自己写的那些类。
4.自定义加载器:负责加载用户自定义路径下的类包。


2.2、双亲委派机制

更多jvm详细内容可看这篇文章:学完了这篇JVM,面试官真拿我没办法了!

JVM类加载机制_开发语言


前面我们说到每个类会有一个对应的类加载器去加载这个类,而不同的类加载器所加载的类的类型不同,当我们要加载一个类的时候首先会去应用程序类加载器加载过的集合里(注:这里是加载过的集合里)查看有没有加载这个类,如果没有就去扩展类加载器加载过的集合里查看有没有加载过这个类,如果没有就再向上去找引导类加载器加载过的集合里看有没有加载过这个类,如果也没有就会从引导类加载器要加载的核心类中寻找有没有要加载的类,如果没有就向下寻找扩展类加载器中要加载的扩展类中有没有,如果也没有就去应用程序加载器中寻找。
好处:
1、不会重复去加载一个类,假如应用程序类加载器加载过Student类,那么下载再加载这个类的时候只需要判断应用程序类加载过的集合里有没有加载过这个类,如果加载过就不用再次加载了。
2、防止恶意修改核心类库,比如我们自己写一个String类,我们去运行这个类,系统会在引导类加载器中加载Java的核心类库中的String类,而不会加载我们自定义个的String类,这就防止我们私自篡改核心类库。


2.3、自定义类加载器并打破双亲委派机制


1.继承ClassLoader
2.重写findClass方法
详细内容请移步至:自定义类加载器并打破双亲委派机制