目录
类加载
- 在Java代码中,类型(class)的加载、连接与初始化过程都是在程序运行期间完成的(动态代理)
- 很多语言的加载和连接是在编译期间完成的,而java是在运行期间完成的,这给有创意的开发人员带来了很多拓展的可能性
- 加载、连接和初始化的次序并不严格,看jvm厂商的实现
- 加载,把磁盘上的class文件加载到内存当中
- 连接,将类与类之间的调用关系给确定好 ,并且对于字节码的相关的处理(验证、校验)都在此阶段完成
- 初始化,类型里面的静态变量的赋值
- 提供了更大的灵活性,增加了更多的可能性
类加载器深入剖析
- Java虚拟机与程序的生命周期
- 在如下几种情况下,Java虚拟机将结束生命周期
- 执行了System.exit()方法
- 程序正常执行结束
- 程序在执行过程中遇到了异常或错误而异常终止(异常抛到了main方法)
- 由于操作系统出现错误而导致Java虚拟机进程终止
类的加载、连接与初始化
- 加载:查找并加载类的二进制数据
- 连接
- 验证:确保被加载的类的正确性
- 准备:为类的静态变量分配内存,并将其初始化为默认值
- 尽管定义值public static int num = 1,但是在准备阶段并不会把1赋值给num变量,而是初始化为0,因为整型变量的默认值为0。所以即使定义public static int num;也会被赋予0
- 解析:把类中的符号引用转换为直接引用
- 符号引用:间接的引用,通过一个符号的表示来去表示一个类里面的方法引用了另外一个类。在Java中,一个java类将会编译成一个class文件。在编译时,java类并不知道所引用的类的实际地址,因此只能使用符号引用来代替。
- 直接引用:直接把方法通过指针的方式指向我们所用的目标对象的内存的位置,这样就一下能找到特定的方法
- 初始化:为类的静态变量赋予正确的初始值
- 此时public final int num = 1定义的num才被赋予1
类的使用与卸载
- 使用
- 卸载
- class加载后驻留在内存中,还可以被销毁。一旦卸载后就不能创建该类的对象
参考: