Jvm类加载class文件原理

当 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);

    }
}

⑤初始化: 如果有父类,就初始化父类再初始化子类; 如果类存在初始化语句就先初始化语句。

经验分享 程序员 微信小程序 职场和发展