官网参考:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5.5
类加载机制
理解: 就是将xxxx.class文件交给 JVM去运行的过程
-
装载
- 先找到类文件所在的位置, 类装载器ClassLoader.find(String name) (双亲委派机制 可以通过重写和线程方式破坏) 寻找类
- 把"类文件的信息文件"交给jvm -->类文件字节码静态存储结构(一种流)--> 加载到JVM的某块区域内(Method Area 方法区)
- 把类文件所对应的对象Class --->JVM ----->放入堆(Heap)
-
链接
- 验证: 保证被加载的类都能正确加载(格式是否正确,字节码是否正确,源数据是否正确)
- 准备: 要为类的静态变量分配内存空间,并且将其值初始化成默认 例如 我们代码中写的是 public static final int a = 10; 这时会将 int a 初始化成默认的 0 也就是 int a = 0
- 解析: 将类中的符号引用(class文件中的一个代称,如String s1 的在class文件中的代称为flag1,flag1就是符号医用,与内存无关)转化为直接引用 String s1 = 真实地址(对应内存中的某一个真实的地址指向)
-
初始化
为静态变量,赋真正的值 a = 10
如图: