扫盲篇:当我们的执行 java -jar xxx.jar 的时候底层到底做了什么?

当我们在命令行执行 “java -jar xxx.jar” 的时候,我们究竟在底层做了什么?这个问题可能看起来很简单,但是它牵涉到很多层面的知识。接下来,我们一起深入探讨这个问题,并了解在执行这个命令时发生了什么。
在这里插入图片描述

Java 程序的执行流程

在深入了解 “java -jar xxx.jar” 命令的底层实现之前,我们需要先了解 Java 程序的执行流程。Java 程序的执行可以分为以下几个步骤:

  1. 编译源代码:Java 源代码是以 .java 文件的形式存在的,我们需要通过编译器将其编译成字节码(.class)文件。
  2. 加载类文件:当我们执行一个 Java 程序时,Java 虚拟机(JVM)会加载所有需要的类文件,并将它们转换为内部的数据结构,例如 Class 对象。
  3. 链接阶段:在链接阶段,JVM 会将类文件中的符号引用解析为直接引用,并进行验证和准备工作。
  4. 初始化阶段:在初始化阶段,JVM 会执行类的静态初始化器,并为类的静态字段分配和初始化内存空间。
  5. 执行阶段:在执行阶段,JVM 会按照字节码文件中的指令序列执行程序,直到程序结束或者抛出异常。
    在这里插入图片描述

“java -jar xxx.jar” 命令的底层实现

现在我们已经了解了 Java 程序的执行流程,我们来看看 “java -jar xxx.jar” 命令的底层实现。这个命令的作用是执行一个打包好的 Java 应用程序,其中 xxx.jar 是可执行的 Jar 包。

  1. 解压缩 Jar 包:当我们执行 “java -jar xxx.jar” 命令时,JVM 会首先将 Jar 包解压缩到临时目录中。
  2. 加载 Main 类:JVM 会根据 Jar 包中的 Manifest 文件中指定的 Main-Class 属性,加载对应的 Main 类。
  3. 解析依赖库:当 JVM 加载 Main 类时,它会检查 Main 类所依赖的库文件是否存在。如果存在,则将这些库文件加载到 JVM 中。
  4. 执行 Main 方法:JVM 加载完 Main 类和所有依赖库之后,会执行 Main 类中的 main() 方法,这是 Java 程序的入口方法。
  5. 执行流程:在执行 Main 方法时,JVM 会按照 Java 程序的执行流程执行程序,直到程序结束或者抛出异常。

需要注意的是,JVM 在加载 Main 类时,会使用双亲委派模型来查找类文件。它首先从自身的类路径中查找,如果找不到,则会向上委托父类加载器进行查找,直到达到引导类加载器(Bootstrap ClassLoader)为止。这种机制保证了 Java 程序的稳定性和安全性,防止类文件被恶意篡改。
在这里插入图片描述除了以上步骤外,JVM 还会进行垃圾回收、线程管理等操作,以保证 Java 程序的正确性和性能。

结语

在本文中,我们深入探讨了 “java -jar xxx.jar” 命令的底层实现,并了解了 Java 程序的执行流程和可能出现的问题。需要注意的是,本文仅仅是介绍了一部分内容,Java 的执行流程和问题非常广泛和复杂,需要在实践中不断学习和探索。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值