类加载过程

本文详细介绍了Java类加载的三个阶段:加载、链接(验证、准备、解析)和初始化,以及每个阶段的具体任务。在链接阶段,验证确保字节流安全,准备阶段为静态变量分配内存并初始化,解析阶段将符号引用转为直接引用。初始化阶段执行静态代码块和静态变量赋值。类加载后,类的字节码存储在方法区,Class对象存在于堆区。同时,文章讨论了多线程环境下类初始化的同步机制。
摘要由CSDN通过智能技术生成

类加载过程

Java源码经过javac编译成字节码文件,Java运行然后类加载
类加载的三个阶段

  1. 加载(Loading)
  2. 链接(Linking):①验证(Verification)②准备(Preparation)③解析(Resolution)
  3. 初始化(Initialization)

加载(JVM运行)

将类的class文件读入内存,并为之创建一个java.lang.Class对象。
JVM在该阶段的主要目的是将字节码从不同的数据源(可能是class文件,也可能是jar包,甚至网络)转化为二进制字节流加载到内存中,并生成一个代表该类的java.lang.class对象

链接(JVM运行)

将类的二进制数据合并到JRE中
(一)验证:

  1. 目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机的自身安全
  2. 包括:文件格式验证(是否以魔数oxcafetable开头)、元数据验证、字节码验证和符号引用验证
  3. 可以考虑-Xverify:none参数来关闭大部分的类验证措施,缩短虚拟机类加载的时间

(二)准备:
JVM会在该阶段对静态变量分配内存并初始化(对应数据类型的默认初始值,如null,false等)。这些变量所使用的内存都将在方法区中进行分配

class A{
/*
	属性-成员变量-字段
	1、n1是实例属性,不是静态变量,因此在准备阶段,是不会分配内存
	2、n2是静态变量,分配内存n2是默认初始化0,而不是20,初始化阶段赋值20
	3、n3是static final是常量,他和静态变量不同因为一旦赋值就不会改变 n3=30
*/
	public int n1=10;
	public static int n2=20;
	public static final int n3=30;
}

(三)解析:
虚拟机将常量池内的符号引用替换为直接引用

初始化

JVM负责对类进行初始化,这里主要是指静态成员

  1. 到初始化阶段,才真正开始执行类中定义的Java程序代码,此阶段是执行< clinit >()方法的过程
  2. < clinit >()方法是由编译器按照语句在源文件中出现的顺序,依次自动收集类中的所有静态变量的赋值动作和静态代码块中的语句,并进行合并。
class B{
	static{
		System.out.println("B静态代码被执行")
		num=300;
	}
	static int num=100;
	public B(){
		System.out.println("构造器被执行")
	}
	/*
	1、加载B类,并生成B类的class对象
	2、链接num=0;
	3、初始化阶段,一次收集类中的所有静态变量的赋值动作和静态代码块中的语句,并合并
	clinit(){
		System.out.println(""B静态代码被执行)
		~~num=300;~~ (被100替换)
		num=100;
	}
	*/
}
  1. 虚拟机会保证一个类的< clinit >()方法在多线程环境中被正确的加锁、同步,如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的< clinit >()方法,其他线程都需要阻塞等待,直到活动线程执行< clinit >()方法完毕
protected Class<?> loadClass (String name;boolean resolve) throws ClassNotFoundException{
	synchronized (getClassLoadingLock(name)){//正因为这个机制才能保证某个类在内存中只有一份class对象
		...
	}
}

类加载后内存布局情况

方法区:类的字节码二进制数据
堆区:类的Class对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值