标签:col bsp 情况 参数 3.1 类型 java and 加载
一个.java文件编译为.class文件后才可以被加载到虚拟机中运行和使用.
虚拟机把描述类的.class文件加载到内存, 并对class文件进行验证、准备、解析和初始化后, 最终形成可以被虚拟机直接使用的Java类型, 这就是虚拟机的类加载机制.
类从加载到虚拟机内存中到卸载出内存为止。它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段。
类加载的顺序即按照此顺序开始,这些阶段通常互相交叉式地混合进行,通常在一个阶段的执行过程中激活下一个阶段。但是某些情况下解析阶段会在初始化后进行(比如在运行时动态的解析某些方法的符合引用,多态的使用等等);
虚拟机规范严格规定了5种情况下必须对类进行初始化,这五种情况称为类的主动引用,除此之外的其他方式都不会触发类的初始化,称为被动引用。
类加载过程一般就是加载、验证、准备、解析、初始化五个阶段。
加载阶段主要完成3件事:
确保class文件的字节流包含的信息符合当前虚拟机的要求,不会为何还虚拟机的自身安全。
为类变量分配内存空间,并设置类变量的初始值,这些变量的内存分配都在方法区中进行。
static final 修饰的变量直接初始化为指定的值。
将常量池中一部分符号引用转化为直接引用的过程。
符号引用:一组用来描述引用目标的符号。
直接引用:直接指向目标的指针,相对偏移量或能间接定位到目标的句柄。
在类加载的解析阶段将符号引用解析为直接引用的前提是:方法在程序真正运行之前就有一个可确定的方法调用版本,并且在 运行期间是不旷课改变的。
Java虚拟机提供了五种方法调用的字节码指令:
能被 invokestatic 和 invokespecia 调用的方法都可以在解析阶段被转化为直接引用,这类方法被称为非虚方法(final 修饰的方法也是非虚方法),其他方法称为虚方法。
解析调用是一个静态的过程,在编译期间就可以完全确定。
分派调用则可能是静态的也可能是动态的,还可以根据分派依据的宗量数分为单分派和多分派。
重载:编译期,静态多分派,根据参数的静态类型确定方法的使用版本
重写:运行期,动态单分派,根据对象的实际类型确定方法的使用版本
根据<clinit>方法为所有的类变量进行赋值,并执行静态代码块。
标签:col bsp 情况 参数 3.1 类型 java and 加载
原文地址:https://www.cnblogs.com/virgosnail/p/9609118.html