视频字幕
JVM类加载是Java虚拟机的核心机制之一。它负责将编译后的class文件中的字节码加载到JVM内存中,并转换为可执行的Java类型。这个过程包括获取字节流、转换数据结构和生成Class对象三个关键步骤。类加载器在其中发挥着重要作用,确保Java程序能够正确运行。
类加载并不是在程序启动时就加载所有类,而是在特定时机才触发。主要有六种触发情况:遇到new、getstatic、putstatic、invokestatic这四个字节码指令时;使用反射调用类时;初始化子类时会先初始化父类;JVM启动时指定的主类;动态语言支持相关的场景;以及接口中定义了default方法的情况。这种按需加载的机制提高了程序的启动速度和内存使用效率。
类加载过程包含五个重要阶段。首先是加载阶段,获取类的字节码并创建Class对象。接下来是连接过程,包括三个子阶段:验证阶段确保字节码的安全性,准备阶段为类变量分配内存并设置初始值,解析阶段将符号引用转换为直接引用。最后是初始化阶段,执行类的初始化代码。需要注意的是,验证、准备、解析这三个阶段可以交叉进行,以提高加载效率。
加载阶段是类加载过程的第一步,主要完成三个关键任务。首先,类加载器通过类的全限定名获取定义此类的二进制字节流,这个字节流可以来自class文件、网络、数据库等多种来源。然后,将这个字节流所代表的静态存储结构转化为方法区中的运行时数据结构,包括常量池、字段信息、方法信息等。最后,在Java堆内存中生成一个代表这个类的Class对象,作为访问方法区中类数据的入口。
验证阶段是连接过程的第一步,确保字节码文件的安全性和正确性。它包含四个子阶段:文件格式验证检查魔数CAFEBABE和版本号等基本信息;元数据验证进行语义分析,检查类的继承关系是否合法;字节码验证通过数据流和控制流分析,确保程序逻辑的正确性;符号引用验证检查引用的类、字段、方法是否存在且可访问。每个验证步骤都像安全检查一样,只有全部通过才能进入下一阶段。