【Java代码的运行过程】 ——每天一点小知识

                                                                               J a v a 代码的运行过程 \color{#FF1493}{Java代码的运行过程} Java代码的运行过程          


仰望天空,妳我亦是行人.✨
个人主页——微风撞见云的博客
《数据结构与算法》专栏的文章图文并茂生动形象简单易学!欢迎大家来踩踩~
《Java学习笔记》专栏的文章是本人在Java学习中总结的一些知识点~
《每天一点小知识》专栏的文章可以丰富你的知识库,滴水成河~
希望本文能够给读者带来一定的帮助~文章粗浅,敬请批评指正!


文章目录

  • Java代码的运行过程
    • 链接
    • 初始化
    • 类加载
    • 双亲委派机制
    • 总结
  • 结语


    理解Java代码的运行过程对于开发者来说非常重要,它可以帮助我们更好地理解Java程序的执行流程和类加载机制。通过深入了解这些概念,我们可以更好地理解Java的工作原理和应用程序的执行过程。


Java代码的运行过程

    在Java中,当我们运行一个Java程序时,它会经历以下过程:链接初始化类加载双亲委派机制。让我们逐步了解每个过程的含义和作用。

【Java代码的运行过程】 ——每天一点小知识_第1张图片

链接

    链接是将Java源代码转换为可执行代码的过程。它分为三个阶段:

  1. 验证(Verification):在这个阶段,Java虚拟机(JVM)将检查字节码的合法性和安全性,以确保它不会对系统造成损害。验证过程包括文件格式验证、元数据验证、字节码验证和符号引用验证

  2. 准备(Preparation):在准备阶段,JVM为类的静态变量分配内存,并设置默认的初始值这些变量在此阶段被赋予默认值,如整数类型的变量赋值为0引用类型的变量赋值为null

  3. 解析(Resolution):在解析阶段,符号引用被解析为直接引用符号引用是指用名称来引用类、方法、字段等的方式,而直接引用是指内存地址或偏移量等具体的指针。解析过程可以在编译时进行,也可以在运行时进行。

【Java代码的运行过程】 ——每天一点小知识_第2张图片

初始化

    初始化是Java类加载过程的最后一步。当一个类被首次主动使用时,它将被初始化。初始化阶段主要完成以下任务:

  1. 静态变量赋值:将静态变量按照代码中的赋值语句进行初始化。

  2. 静态代码块执行如果类中有静态代码块,那么在初始化阶段会执行这些静态代码块。

  3. 执行父类的初始化如果该类有父类,并且父类还没有被初始化,那么会先初始化父类

    初始化过程按照严格的顺序进行的,保证了每个类的初始化操作是可控的。

类加载

    类加载是Java代码运行过程的关键步骤之一。它负责将类的字节码加载到JVM中,并对其进行解析验证准备。类加载过程主要包括以下步骤:

  1. 加载:查找字节码,并将其加载到内存中。

  2. 连接:包括验证准备解析阶段。

  3. 初始化:执行类的初始化操作

类加载过程由类加载器(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类加载器的一种工作方式。当一个类加载器接收到加载类的请求时,它会先将这个请求委派给其父加载器进行处理。只有在父加载器无法找到所需类的情况下,子加载器才会尝试自己加载。

这种机制的好处在于可以保证类的加载是一种层次结构,避免了类的重复加载冲突。它的工作流程如下:

  1. 当一个类加载器收到加载类的请求时,首先检查是否已经被加载过如果已经加载过,直接返回对应的类

  2. 如果尚未加载过,则将加载请求委派给父加载器

  3. 父加载器接收到请求后重复上述过程直到到达启动类加载器。如果启动类加载器无法加载该类,将返回一个ClassNotFoundException异常。

  4. 如果父加载器成功加载了类,将返回对应的类。子加载器收到类后,也会返回给请求者

通过双亲委派机制,可以确保类的加载是从上到下的层次结构,避免了类的重复加载安全性问题
【Java代码的运行过程】 ——每天一点小知识_第3张图片

总结

    Java代码的运行过程包括链接、初始化、类加载和双亲委派机制链接阶段将Java源代码转换为可执行代码,包括验证、准备和解析。初始化阶段完成静态变量赋值和静态代码块执行等操作。类加载过程由启动类加载器、扩展类加载器和应用程序类加载器完成,并遵循双亲委派机制,确保类的加载是一种层次结构。


在这里插入图片描述


结语

初学一门技术时,总有些许的疑惑,别怕,它们是我们学习路上的点点繁星,帮助我们不断成长。

积少成多,滴水成河。文章粗浅,希望对大家有帮助!

参考文献:

  • Java Class Loading Mechanism
  • Understanding Class Loading in Java
  • The Java ClassLoader
  • Understanding the Java ClassLoader

你可能感兴趣的:(每天一点小知识,java,jvm)