java通过javac编译后得到字节码文件(.class),那么字节码文件又是如何被计算机执行的呢?本节来学习类加载机制
什么是类加载
简单来说就是将.class文件实例成Class对象并进行初始化的过程,字节码必须通过类加载过程加载到JVM环境后才可以执行
classloder(类加载器)的使命就是将.class文件加载到内存中,在启动之初进行类的Load、Link和Init,在加载类时使用的是双亲委派模型
类加载
类加载过程
-
1 加载阶段读取类文件产生的二进制流并转为特定的数据结构,创建对应的java.lang.Class实例
-
2 链接,包括验证、准备和解析三步,准备阶段是为静态变量分配内存并设定默认值解析类和方法确保类与类之间的相互引用的正确性,完成内存的布局
-
3 Init初始化阶段,执行类构造器的
方法
JIT编译(即时编译)
作用:是将java字节码动态的编译成可以直接发送给处理器指令执行的机器码
在 HotSpot 虚拟机中,内置了两种 JIT,分别为C1 编译器和C2 编译器,这两个编译器的编译过程是不一样的。
类加载器
字节码文件加载到内存就是通过类加载器来实现的,类加载器类似于原始部落结构存在权力等级,最高的一层是家族中威望最高的Bootstrap,它是jvm启动时创建的,是通过C来实现的,并不存在于JVM中
双亲委派模型
类加载器之间的这种层次关系就是双亲委派模型。双亲委派模型要求除了顶层的启动类加载器外,其他的类加载器都应有自己的父类加载器
这部分内容是对第一张图中加载这个方框部分的内容的拓展
如何自定义类加载器
类加载器,将我们的class文件读取到内存中,实际中如果需要自己来实现一个类加载器应该怎么做呢
自定义类加载器的场景
1、存放在自定义路径上的类,需要通过自定义类加载器去加载。【注意:AppClassLoader加载classpath下的类】
2、类不一定从文件中加载,也可能从网络中的流中加载,这就需要自定义加载器去实现加密解密。
方式
继承ClassLoader重写findClass,在findClass里获取类的字节码,并调用ClassLoader中的defineClass方法来加载类,获取class对象
ClassLoader类是一个抽象类
评论区