在java的程序中类的加载、连接、初始化都是在程序的运行期间完成的,具体如下:
一、加载:将磁盘中编译后的class文件加载到内存中(主要是指加载类的二进制文件)
二、连接: 主要分为三部分
1): 验证: 确保被加载类的正确性
2): 准备: 为类的静态变量分配内存,并将其初始化为默认值(4类8种的默认值)
3): 解析: 将类中的符号引用转换为直接引用
三、初始化:将类中的静态变量赋予正确的初始值
四、使用:类的使用,类初始化完成后可以直接使用(作为对象模板的创建使用、或者使用类的静态变量等等)
五、卸载:类可以卸载,及从内存中删除,被卸载完成后类就不能使用了
java虚拟机结束生命周期有以下几种情况:
1:执行System.exit()方法
2:程序正常结束
3:程序在运行过程中遇到错误或者异常而异常终止
4:由于操作系统出现错误而导致java虚拟机的终止
符号引用与直接引用的区别
符号引用(Symbolic References):符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可。例如,在Class文件中它以CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等类型的常量出现。符号引用与虚拟机的内存布局无关,引用的目标并不一定加载到内存中。在Java中,一个java类将会编译成一个class文件。在编译时,java类并不知道所引用的类的实际地址,因此只能使用符号引用来代替。比如org.simple.People类引用了org.simple.Language类,在编译时People类并不知道Language类的实际内存地址,因此只能使用符号org.simple.Language(假设是这个,当然实际中是由类似于CONSTANT_Class_info的常量来表示的)来表示Language类的地址。各种虚拟机实现的内存布局可能有所不同,但是它们能接受的符号引用都是一致的,因为符号引用的字面量形式明确定义在Java虚拟机规范的Class文件格式中。
直接引用:
直接引用可以是
(1)直接指向目标的指针(比如,指向“类型”【Class对象】、类变量、类方法的直接引用可能是指向方法区的指针)
(2)相对偏移量(比如,指向实例变量、实例方法的直接引用都是偏移量)
(3)一个能间接定位到目标的句柄
直接引用是和虚拟机的布局相关的,同一个符号引用在不同的虚拟机实例上翻译出来的直接引用一般不会相同。如果有了直接引用,那引用的目标必定已经被加载入内存中了。
网友评论