1.类加载子系统
只负责加载class文件
分三个阶段
1.1加载
1.1.1通过类名获取定义此类的二进制字节流
1.1.2将字节流代表的静态存储结构转化为方法区的运行时数据结构
1.1.3在内存中生成代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问接口
1.2链接
1.2.1验证
验证class文件中字节流信息的符合当前虚拟机要求
1.2.2准备
为类变量分配空间并设置变量的默认初始值如int 的设置为0 ,注意,这时变量还未初始化,
不包括加了final修饰的static,因为final在编译时就会分配,准备阶段会显式初始化
类变量分配在方法区,实例变量随对象放到java堆中
1.2.3解析
常量池内的符号转换成直接引用的过程
事实上,解析会伴随着JVM在执行完初始化之后再执行
1.3初始化
执行类构造器方法
对类变量赋值和静态代码区中的语句一起
按顺序执行
保证一个类在多线程下同步加锁,否则一个加载后加锁后会阻塞其他线程的进行。