代码编织梦想

当我们在命令行执行 “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 的执行流程和问题非常广泛和复杂,需要在实践中不断学习和探索。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/z1ztai/article/details/129835574

零基础秒懂:手把手教你搭建一套微服务框架!-爱代码爱编程

零基础秒懂:手把手教你搭建一套微服务框架! 这套微服务框架能干啥? 这套系统搭建完之后,可以实现: 微服务架构,你的整个应用程序将会被拆分成一个个功能独立的子系统,独立运行,系统与系统之间通过 RPC 接口通信。 这样系统之间的耦合度大大降低,你的系统将非常容易扩展,团队协作效率提升了 N 个档次。 这种架构通过眼下流行的 Spring Boot

京淘-02-爱代码爱编程

springboot的高级用法 1.1 关于SpringBoot配置文件的说明 1.1.1 properties说明 1.语法: k-v结构 key=value 2.数据类型: 默认是String数据类型 不要添加多余的""号 3.字符数据类型: properties的默认的加载的编码格式为ISO-8859-1 所以添加中文是需要字符转意. 4.缺点

cgb2007-京淘day02-爱代码爱编程

1.SpringBoot高级用法 1.1 关于SpringBoot配置文件的说明 1.1.1 properties说明 1.语法: k-v结构 key=value 2.数据类型: 默认是String数据类型 不要添加多余的""号 3.字符数据类型: properties的默认的加载的编码格式为ISO-8859-1 所以添加中文是需要字符转意. 4.缺

python学什么数据库_总算晓得python数据库学什么-爱代码爱编程

Python是一款功能强大的脚本语言,具有丰富和强大的库,重要的是,它还具有很强的可读性,易用易学,非常适合编程初学者入门。以下是小编为你整理的python数据库学什么 环境配置:下载Python并安装,安装完成后,配置windows的环境变量:打开高级系统设置,将Python的安装目录添加到系统变量path中。配置完成后,在cmd命令行,输入命令"Pyt

dubbo内置哪几种服务容器_GitHub - xlzuijia/SpringBoot-Dubbo-Docker-Jenkins: 基于SpringBoot+Dubbo的微服务框架(借助Docker+...-爱代码爱编程

本文你将学到什么? 本文将以原理+实战的方式,首先对“微服务”相关的概念进行知识点扫盲,然后开始手把手教你搭建这一整套的微服务系统。 这套微服务框架能干啥? 这套系统搭建完之后,那可就厉害了: 微服务架构 你的整个应用程序将会被拆分成一个个功能独立的子系统,独立运行,系统与系统之间通过RPC接口通信。这样这些系统之间的耦合度大大降低,你的系统

能画一张图说说Spring Boot的核心架构吗?-爱代码爱编程

软负载、硬负载,这些负载均衡知识你都会了吗? 徒手撸一个Spring Boot中的starter spring的时候,带一下spring boot,有时候出去面试,也会问到spring boot,提的一个点,spring boot启动的时候一个流程图,本身他是spring这个项目发展到一定阶段之后的一个产物 spring框架,mybat

OTA-扫盲-爱代码爱编程

文章目录 前言一、种类划分三、OTA升级log三、OTA包制作 full包差分包总结 前言 OTA(over the air)一种通过空中下载技术下载升级的方式,指的通常是使用wifi或者数据流量的方式从服务器中将升级包下载到本地升级的一种方式;但是本地使用OTA包的升方式,我们也可以称之为OTA升级(概念的扩展),简单理解起

Android APT注解扫盲-爱代码爱编程

前言 刚接触java不久的小猿们可能不知道注解这东东干嘛的,或者有些老鸟们也是一知半解只会用而不知其所以然。所以,在了解注解是什么之前,我先来说说这个东东有神马用,场景都有哪些,目前有没有范本。知道这些后,再看看,各位当前阶段是不是需要学,还是后续用到在深究。首先,说下用处,通过注解主要可以简化开发人员重复性工作和自动化过程,但不提高代码执行效率,用于框

linux---基础命令-爱代码爱编程

1. 基础命令  1.1 扫盲 # 1 linux历史:作者:内核 +GNU=发行版(readhat,centos,乌班图) # 2 docker,在乌班图上开发完成,最新功能对它支持最好,乌班图内核比较新,centos上装docker,需要7版本以上(7.6) # 3 GPL协议 # 4 Apache 服务器: # 5 javase:基础 javae

hudi数据湖-基于flink、spark湖仓一体、实时入湖保姆级教学_笑一笑0628的博客-爱代码爱编程

目录 Hudi源码编译Hudi扫盲基于Spark-shell集成Hudi基于Spark-Hive集成Hudi手动创建HIVE表基于SparkSQL集成Hudi自动创建HIVE表基于FlinkSQL集成Hudi基于FlinkSQL-HIVE集成Hudi手动创建HIVE表基于FlinkSQL集成Hudi-自动创建Hive表基于FlinkCDC集成Hud

通过 flowable-ui 来体验一把 flowable 流程引擎_程序一逸的博客-爱代码爱编程

Flowable 开篇,流程引擎扫盲 在我们使用 Flowable 的过程中,最重要的流程绘制工具就是 Flowable-UI 了,虽然我们在上篇文章和大伙也介绍了不少流程绘制工具,但是个人感觉,还是 Flowable-UI 更好用一些。 今天我们就来聊聊 Flowable-UI 的一些玩法。 1. Flowable-UI Flowable-UI 说

第二周总结(2022.10.24~2022.10.28)_int public=100为什么错-爱代码爱编程

目录 本周内容 DAY1 1.计算机的基础知识(应用/硬件/软件) 什么是计算机? 计算机的用途 计算机的硬件 计算机软件 软件结构的划分 软件开发 人机交互 人机交互的两种方式 常用的dos窗口命令 Java学习 Java职业发展规划 Java发展历史 Java语言完成的哪些事情 Java平台版本(重点) 关于Java