微服务架构师成长之路(十三)JAVA类加载机制
JAVA类加载机制
新的改变
由于工作忙碌,有一段时间没有更新博客了,望大家见谅。前面的十二章主要给大家分享了一些主流的技术架构和解决方案,后面的一部分内容我将为大家更新一下关于Java的更深层次的分析。
课题前瞻
我们要理解类加载机制之前就要明白一件事情,为什么需要这个东西。通俗易懂的说,就是JAVA他是一个跨平台的语言,原因是有JVM的加持。我们平时编写的.java文件,必须通过类加载机制才能编译成.class文件,然后交由JVM去解析,之后才能对计算机进行一些指令操作。有了基本的概念,我们就可以继续去探讨类加载机制的原理。
类加载机制原理
类加载机制主要分为以下三种,话不多说,献上图片。
为什么JDK将类加载器分为三级?这里我们就不得不提双亲委派机制。看上图得知加载我们自己写的类是由应用类加载器完成的。这里就会有一个问题,万一我们自己也定义了java.lang包,自己写了Object类,这样就会和JDK有冲突。所以采用双亲委派机制可以将自己写的类向上传递,让父级去加载,由于引导类加载器已经加载了Object类,所以我们自定义的Object类是不会再次被加载的,只有当父类的加载器没有加载的情况下,才由我们的应用加载器加载,这样保护JAVA程序的安全性。
当然了,这种机制是可以被打破的。其中应用最多的就是SPI机制。通俗来说,SPI机制就是面向接口编程的思想,一个接口有多个实现类,可以根据不同应用切换成不同的实现类,和IOC差不多,只不过是将控制权交到了程序外。jdbc的驱动加载也是如此,通过JDK提供的线程上下文类加载器获取应用类加载器,加载META-INF-service下的mysql接口,通过反射机制获取实现类,这就打破了双亲委派机制。
类加载的过程
1.加载:就是JVM把类转换为二进制字节流,然后将字节流中的静态数据放在方法区中,然后再在堆中生成一个该类Class对象,作为访问这些静态数据的入口。
2.验证:就是验证类的正确性。比如验证子类方法是否和父类冲突,确定程序语义符号是否合法等等。
3.准备:主要就是把类中的静态变量分配内存和赋初始值。
4.解析:就是将符号引用改为直接引用。意思就是用虚拟机自己实现的内存句柄去替代字面上意义的引用关系。
5.初始化:这是类加载的最后一步,主要就是创建类的实例,给声明的变量初始化。
本文地址:https://blog.csdn.net/qq_44816669/article/details/110193919