Java代码的运行过程
💧在Java中,当我们运行一个Java程序时,它会经历以下过程:链接
、初始化
、类加载
和双亲委派机制
。让我们逐步了解每个过程的含义和作用。
🌊链接
链接是将Java源代码转换为可执行代码的过程。它分为三个阶段:
💧验证(Verification):在这个阶段,Java虚拟机(JVM)将检查字节码的合法性和安全性,以确保它不会对系统造成损害。验证过程包括文件格式验证、元数据验证、字节码验证和符号引用验证。
💧准备(Preparation):在准备阶段,JVM为类的静态变量分配内存,并设置默认的初始值。这些变量在此阶段被赋予默认值,如整数类型的变量赋值为0,引用类型的变量赋值为null。
💧解析(Resolution):在解析阶段,符号引用被解析为直接引用。符号引用是指用名称来引用类、方法、字段等的方式,而直接引用是指内存地址或偏移量等具体的指针。解析过程可以在编译时进行,也可以在运行时进行。
🌊初始化
初始化是Java类加载过程的最后一步。当一个类被首次主动使用时,它将被初始化。初始化阶段主要完成以下任务:
💧静态变量赋值:将静态变量按照代码中的赋值语句进行初始化。
💧静态代码块执行:如果类中有静态代码块,那么在初始化阶段会执行这些静态代码块。
💧执行父类的初始化:如果该类有父类,并且父类还没有被初始化,那么会先初始化父类。
初始化过程是按照严格的顺序进行的,保证了每个类的初始化操作是可控的。
🌊类加载
类加载是Java代码运行过程的关键步骤之一。它负责将类的字节码加载到JVM中,并对其进行解析、验证和准备。类加载过程主要包括以下步骤:
💧加载:查找类的字节码,并将其加载到内存中。
💧连接:包括验证、准备和解析阶段。
💧初始化:执行类的初始化操作。
类加载过程由类加载器(ClassLoader)执行,Java中有三种类加载器:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader)。
启动类加载器:负责加载Java核心库,如rt.jar。它是Java虚拟机的一部分,由C++实现。
扩展类加载器:负责加载Java扩展库,如ext目录下的JAR文件。它是由Java编写的,是sun.misc.Launcher$ExtClassLoader类的实例。
应用程序类加载器:也称为系统类加载器,负责加载应用程序的类路径(Classpath)下的类。它是由Java编写的,是sun.misc.Launcher$AppClassLoader类的实例。
这三种类加载器按照父子关系形成了一种层次结构,即双亲委派模型。
🌊双亲委派机制
双亲委派机制是Java类加载器的一种工作方式。当一个类加载器接收到加载类的请求时,它会先将这个请求委派给其父加载器进行处理。只有在父加载器无法找到所需类的情况下,子加载器才会尝试自己加载。
这种机制的好处在于可以保证类的加载是一种层次结构,避免了类的重复加载和冲突。它的工作流程如下:
💧当一个类加载器收到加载类的请求时,首先检查是否已经被加载过。如果已经加载过,直接返回对应的类。
💧如果尚未加载过,则将加载请求委派给父加载器。
💧父加载器接收到请求后,重复上述过程,直到到达启动类加载器。如果启动类加载器无法加载该类,将返回一个ClassNotFoundException异常。
💧如果父加载器成功加载了类,将返回对应的类。子加载器收到类后,也会返回给请求者。
通过双亲委派机制,可以确保类的加载是从上到下的层次结构,避免了类的重复加载和安全性问题。
🌊总结
Java代码的运行过程包括链接、初始化、类加载和双亲委派机制。链接阶段将Java源代码转换为可执行代码,包括验证、准备和解析。初始化阶段完成静态变量赋值和静态代码块执行等操作。类加载过程由启动类加载器、扩展类加载器和应用程序类加载器完成,并遵循双亲委派机制,确保类的加载是一种层次结构。
🐳结语
🐬初学一门技术时,总有些许的疑惑,别怕,它们是我们学习路上的点点繁星,帮助我们不断成长。
🐟积少成多,滴水成河。文章粗浅,希望对大家有帮助!