在java代码中,“类型”的加载loading,链接linking,初始化过程都是在运行期间完成的
1,加载(loading)一般指:查找并将类的字节码文件通过类加载器加载到内存中,
还有其他方式加载例如:从网络上加载class;从jar加载class;java源文件动态编译并加载
The Java Virtual Machine dynamically loads, links and initializes classes and interfaces.
java虚拟机动态加载,链接,初始化类和接口类型,
Loading is the process of finding the binary representation of a class or interface type with a particular name and creating a class or interface from that binary representation.
加载是一个发现具有特定名字的类和接口类型的二进制表现和从二进制表示创建类和接口的过程,
Linking is the process of taking a class or interface and combining it into the run-time state of the Java Virtual Machine so that it can be executed.
链接是一个获取类和接口并且把它结合到虚拟机运行时状态被执行的过程。
Initialization of a class or interface consists of executing the class or interface initialization method
初始化类和接口时会执行类和接口的初始化方法。
(本人亲自翻译,看原文可见链接:https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-5.html#jvms-5.5)
2,链接(linking) 是一个过程:验证verification+准备preparation+解析resolution
2.1,验证(verification):确保被加载的类符合JVM的规范
主要包括四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证。
2.2,准备(preparation):类的静态变量分配内存,给静态变量初始化为默认值,int a = 0
2.3,解析(resolution):将类中的符号引用(间接引用)转换为直接引用
3,初始化(initialization)
类的静态变量赋予正确的初始化值,例如:生命中static a = 3,此时,给a变量赋值为3.
4,使用(using)
5,卸载(unloading)
将类从内存中清理掉。
名词解释
类型:class,interface,enum
问题,
1为什么第二个叫linking
答:从英文上可以看出,链接是将类和接口结合到jvm运行状态,这个结合的过程就叫做链接。
2间接引用,直接引用是啥?
答:当一个Java类被编译成Class之后,假如这个类称为A,并且A中引用了B,那么在编译阶段A是不知道B有没有被编译的,而且此时B也一定没有被加载,所以A 肯定不知道B的实际地址,那么此时在A的class文件中,将使用一个字符串S来代表B的地址,S就被称为符号引用,在运行时,如果A发生了类加载到了解析阶段会发现B还未被加载,那么将会触发B的类加载,将B加载到虚拟机中,此时A中B的符号引用将会被替换为B的实际地址,这被称为直接引用。这样也能真正的调用B了
小结:
1,2,3个阶段中变量的操作,只和类的静态变量相关,此时还没有该类的对象生成。
知识小点心:
java虚拟机与程序的生命周期,以下四种情况JVM将结束生命周期
1,程序中显式调用System.exit()方法
2,程序正常运行结束
3,程序运行时抛出运行时异常,没有被处理,异常结束JVM的生命周期
4,OS内部报错。