当 Java 程序需要使用某个类时,JVM 会确保这个类已经被加载、连接(验证、准备和解析)和初始化。
①类加载器创建字节数组读取.class文件生成Class对象进内存;
②校验;
③准备:为静态变量分配内存并设置默认值
在JVM的类加载过程中,在解析阶段,Java虚拟机会把类的二级制数据中的符号引用替换为直接引用。
④解析:将符号引用替换为直接引用
在Java中,一个java类将会编译成一个class文件。在编译时,java类并不知道所引用的类的实际地址,因此只能使用符号引用来代替。
比如org.simple.People类引用了org.simple.Language类,在编译时People类并不知道Language类的实际内存地址,因此只能使用符号org.simple.Language来表示Language类的地址。各种虚拟机实现的内存布局可能有所不同,但是它们能接受的符号引用都是一致的,因为符号引用的字面量形式明确定义在Java虚拟机规范的Class文件格式中。
public class People{
private Language language;
}
public class Language{
prive static String language = "chinese";
}
public class Test {
public void printf() {
org.simple.People people = new org.simple.People()
String language = org.simple.Language.language
System.out.println(language);
}
}
直接引用
直接引用是和虚拟机的布局相关的,同一个符号引用在不同的虚拟机实例上翻译出来的直接引用一般不会相同。
如果有了直接引用,那引用的目标必定已经被加载入内存中了。
直接引用可以有不同的实现方式:
直接指向目标的指针(比如,指向“类型”【Class对象】、类变量、类方法的直接引用可能是指向方法区的指针)
public class Test {
public void printf() {
People people = new People()
String language = Language.language
System.out.println(language);
}
}
⑤初始化:
如果有父类,就初始化父类再初始化子类;
如果类存在初始化语句就先初始化语句。
本文详细阐述了Java的类加载过程,包括类加载、校验、准备、解析和初始化五个阶段。在解析阶段,符号引用被转换为直接引用,使得Java程序能在运行时找到确切的内存地址。初始化阶段涉及父类的初始化和类初始化语句的执行。文章通过实例代码展示了这一过程,深入理解这些概念对于优化Java应用性能至关重要。
1768

被折叠的 条评论
为什么被折叠?



