面试官:说一下Java类的加载过程

类的加载分为三个部分:加载、连接、初始化


1.加载

1)类的加载通过类的全限定名将.class文件的二进制字节流读入内存(JDK1.7之前为JVM内存,JDK1.8后为本地内存)

2)在堆中为之创建Class对象。

在这个阶段读入二进制字节流,会在后续验证阶段验证.class文件,验证通过后会将二进制字节流转化为运行时数据结构存入方法区

拓展:在JDK1.7之前,Hot Spot JVM 存在一块叫方法区的内存,也称之为永久代,这块区域用于存放类的元数据信息,包括类的字段、版本、方法等。JDK1.8,取消了方法区,以元数据区代替,该元数据区并非JVM内存,而是本地内存。

此外在JDK1.7时将常量池从方法区移除,在堆内存开辟了一块空间作为常量池,这是为取消永久代做准备。
为什么取消方法区(永久代)
官方说法:为了将HotSpot JVM和JRockit VM融合,JRockit无永久代。
现实使用中存在这样的问题,方法区(永久代)存储类的元数据信息,我们不清楚一个程序到底有多少类会被加载,JDK1.7方法区位于JVM内存,我们不清楚需要给方法区分配多大内存,太小容易永久代内存溢出(PermGen OOM),太大的话在触发FullGC是又影响性能。

2.连接

连接分为三个阶段:验证、准备、解析

2.1验证

这个阶段主要为保证加载进来的字节流符合JVM的规范,不会对JVM的安全性产生问题。

主要完成四个方面验证:

1)文件格式验证:
验证字节流是否符合Class文件规范,能否被当前版本虚拟机处理。只有通过了文件格式验证,字节流才会存入方法区。(后面三个验证都是基于方法区的存储结构,不会在操作字节流)

2)元数据验证:
对字节码描述的信息进行语义分析。例如,这个类是否继承了不允许继承的类(例如被final修饰的类);非抽象类是否实现了父类中或接口中所有的抽象方法。

扫描二维码关注公众号,回复: 14804888 查看本文章

3)字节码验证:
确定程序语义是合法的、符合逻辑的。在元数据验证的基础上,对类的方法体进行验证,保证被验证类不会在运行时做出危害虚拟机的行为。例如,保证任意时刻操作数栈的数据类型与指令代码序列都能配合工作。

4)符号引用验证:
验证发生在虚拟机将符号引用化为直接引用的时候,转化发生在解析阶段。符号引用验证可以看作是对类自身以外的各类信息进行匹配校验,例如,符号引用能否通过全限定名找到对应的类,符号引用中的类、字段、方法的可访问性可否被当前类访问。

2.2准备

准备阶段只要为类的类变量(静态变量)开辟空间并赋默认值。

1)静态变量是基本类型默认值为0

2)静态变量是引用类型的,默认值为null

3)静态常量(final静态变量)默认值为声明是的设定值,例如,public static final int i=3 在准备阶段i的默认值为3

2.3解析

该阶段的主要职责为将Class在常量池中的符号引用转化为直接引用,此过程伴随符号引用的验证。

类或接口的解析,若不具备访问权限会抛出java.lang.IllegalAccessError异常
字段解析,解析失败会抛出java.lang.NoSuchFieldError异常,权限验证失败会抛出java.lang.IllegalAccessError异常
方法解析或接口方法,若抽象类会抛出java.lang.AbstractMethodError异常,若查找失败抛出java.lang.NoSuchMethodError异常,如无权限抛出java.lang.IllegalAccessError异常

这部分想详细了解可以看java 验证阶段_加载、验证、准备、解析、初始化--Java类加载过程总结分析_Dr.小粉红的博客-CSDN博客

3.初始化阶段

在准备阶段,类变量已经被赋过默认初始值,在初始化阶段,类变量将被赋值为代码期望赋的值。换句话说,初始化阶段是执行类构造器方法的过程。

初始化顺序如下:

1)父类静态代码块和静态属性

2)子类静态代码块和静态属性

3)父类普通代码块和普通属性

4)父类构造函数

5)子类普通代码块和普通属性

6)子类构造函数

其中,
静态代码块和静态属性按代码中从上到下出现的先后顺序加载
按照普通代码块和普通属性按代码中从上到下出现的先后顺序加载

本文参考文档:

请你说说Java类的加载过程_LuckyWangxs的博客-CSDN博客_java类的加载过程

java 验证阶段_加载、验证、准备、解析、初始化--Java类加载过程总结分析_Dr.小粉红的博客-CSDN博客

面试准备(五) java类的初始化和实例化_小菜菜1223的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/Ahuuua/article/details/124149100