java--- 类加载过程

131 阅读2分钟

**类加载,是指磁盘文件加载到jvm内存的过程的。 在生成jar包或者编译项目文件的适合,会生成二进制字节码class文件,这是是在磁盘上的。类加载,就是把class加载到内存中,运行起来。 **

  1. 验证:验证字节码文件格式是否规范正确。因为字节码文件是有自己特殊格式,都是以cafebabe 开头,后面内容也有特定的规范(需要深入了解,可以自寻资料)
  2. 准备:类中有静态变量,准备是对静态变量做初始值赋值(记住不是赋值给代码上的值,是 Java默认初始值。例如代码上是 static int i = 100,这时的初始值赋值是0,而不 是100,举一反三,布尔值赋值位false)。注意如果加上final 就变成常量,是直 接赋值100的(final static int i = 100)
  3. 解析:jvm中有符号引用和直接引用(符号就是代码上的一些方法名,参数名等等信息) 1)符号引用是用一组符号来描述所引用的目标,符号可以是任意格式的字面量,可以无歧 义 的定位到目标。(代码写了A引用B,在java编程成class文件时,无法知道B的具体地址, 这时就用符号来代替) 2)直接引用直接指向目标的指针,如类对象、类变量、类方法。(内存地址) 解析就是将符号引用替换为直接引用。是静态链接的过程(类加载期间完成的),这时有人可 以想说,是不是有动态链接(没错有的,需要深入了解,可以自寻资料)
  4. 初始化:这时就是初始化静态变量的赋值了(例如代码上是 static int i = 100,这时的 初始值赋值是100),执行静态代码。

类加载到内存的信息,有运行时常量池,类型信息,字段信息,方法信息,类加载器引用,class对象的引用。

  1. 类加载器引用:就是类到类加载期的应用。
  2. class对象的引用:class文件加载到内存后,会产生对应的class类型的对象放在内存堆中。

注意的是:主类在运行过程中,如果调用了其他类,会慢慢地加载,一步一步的来(算是懒加载), 也就是在用到的时候再加载。(例如main方法中有new A(),B b = null.这时只会加载A,不会加载B,因为B没有被用)