1、揭开程序运行的神秘面纱

news2024/12/23 20:01:55

要深入理解JVM技术,我们必须先搞清楚一个基本问题:我们日常编写的Java代码是如何被执行的呢?

让我们逐步解析这个问题。首先,假设我们已经编写了一些Java代码,这些代码通常会包含许多以“.java”为后缀的源文件,例如Hello.java,Test.java等。实际上,作为Java开发者,我们在如Eclipse、Intellij IDEA等集成开发环境(IDE)中,经常会创建和编辑这样的Java源代码文件。

现在,让我们思考一下,当我们完成这些“.java”文件的编写后,如果我们想要将这些代码部署到线上服务器上运行,我们应该怎么做呢?通常的做法是将我们的代码编译并打包成“.jar”或“.war”文件,对吗?

接下来,我们会将打包好的jar或war文件部署到线上服务器。部署的方式有很多种,但最基本的方式之一是使用诸如Tomcat这样的应用服务器来部署,或者你也可以选择手动通过执行“java”命令来运行jar文件中的代码。

为了更好地理解这个过程,我们可以参考下面的流程图来回忆这个顺序。
在这里插入图片描述

但是,实际上这里有一个非常关键的步骤,那就是“编译”。在我们编写好的“.java”代码进行打包的过程中,通常会将代码编译成以“.class”为后缀的字节码文件,例如“Hello.class”,“Test.class”。然后,这些以“.class”为后缀的字节码文件才是可以被运行的!

在编译过程中,Java编译器会将我们编写的源代码(.java文件)翻译成计算机可以理解的字节码(.class文件)。这个过程涉及到词法分析、语法分析、语义分析和代码生成等步骤。编译后的字节码文件是一种中间代码,它不是特定于任何硬件平台的机器语言,而是可以在Java虚拟机(JVM)上执行的指令集。

通过编译,我们可以将高级语言编写的代码转换为计算机可以执行的代码,从而实现程序的运行。在编译过程中,编译器还负责检查代码中的错误,并生成相应的错误报告,帮助我们调试和修复代码中的问题。
在这里插入图片描述

接下来思考一个问题: 如何让编译好的".class"字节码运行起来呢? 为了实现这一目标,我们需要使用类似"java -jar"等命令来运行我们编写的代码。 当你使用"java"命令时,实际上就会启动一个JVM(Java虚拟机)进程。 这个JVM负责执行这些".class"字节码文件,相当于负责运行我们编写的系统。 因此,当我们在一台机器上部署一个系统时,一旦你启动该系统,实际上是启动了一个JVM,由它来负责运行该机器上的系统。 对于这个概念,大家一定要先理解清楚。
在这里插入图片描述

在继续下一步之前,我们需要了解JVM是如何运行“.class”字节码文件中的代码的。首先,JVM需要将这些“.class”文件中包含的各种类加载进来,这些“.class”文件实际上是我们编写的每一个类。

为了实现这个过程,引入了“类加载器”的概念。类加载器负责将编译好的“.class”字节码文件加载到JVM中,以便后续代码运行时使用。我们再看下图。
在这里插入图片描述

接下来,JVM将利用其内置的字节码执行引擎来运行已经加载到内存中的我们编写的类。

例如,如果你的代码中包含一个名为“main()”的方法,JVM将会从这个“main()”方法开始执行其中的代码。当JVM需要某个类时,它就会使用类加载器来加载相应的类。这些类都存储在以“.class”为扩展名的文件中。

在这里插入图片描述

本文从我们平时编写的“.java”后缀的源代码开始,逐步梳理了以下的流程:

  1. 将编写好的代码编译成“.class”后缀的字节码文件。
  2. 介绍JVM(Java虚拟机)的概念和作用。
  3. 探讨JVM与我们在计算机上运行的操作系统之间的关系。
  4. 解释类加载器的概念。
  5. 针对加载进内存的类进行代码的执行。

接下来,我将详细阐述以上流程:

  1. 在编写好“.java”后缀的源代码后,我们需要将其编译成“.class”后缀的字节码文件。这个步骤可以通过使用Java编译器(例如javac)来完成。编译后的字节码文件包含了可由Java虚拟机(JVM)执行的指令。

  2. JVM是Java虚拟机的缩写,它是一个虚拟的计算机,用于执行Java字节码。JVM负责将字节码文件转换为特定平台上的机器码,并确保不同平台上的Java程序能够正确运行。

  3. JVM与我们平时运行在机器上的操作系统之间存在密切的关系。JVM作为Java程序与底层操作系统之间的中间层,负责管理和控制Java程序的执行。它提供了一种独立于具体硬件平台的运行环境,使得Java程序能够在不同的操作系统上运行而无需修改源代码。

  4. 类加载器是JVM中的一个重要概念。它负责将字节码文件加载到内存中,并将其转化为可执行的Java类。类加载器会按照需要动态地加载类,而不是一次性将所有类加载到内存中。这样可以减少程序的启动时间和内存占用。

  5. 一旦类被加载进内存中,JVM就可以对其进行代码的执行。这个过程包括解释执行和即时编译两种方式。解释执行是指JVM逐行解释字节码指令并执行,而即时编译则是将热点代码(经常执行的代码片段)编译成本地机器码,以提高执行效率。

通过以上的流程梳理,我们可以更好地理解Java代码从编写到执行的整个过程,以及JVM在其中扮演的重要角色。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1613438.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《深入浅出.NET框架设计与实现》笔记2——C#源码从编写到执行的流程

中间语言(Intermediate Language,IL) C#编译器在编译时,会将源代码作为输入,并以中间语言形式输入出,该代码保存在*.exe文件中或*.dll文件中。 公共语言运行时(CLR) 可以将IL代码…

ROS机器人入门第七课:参数服务器

文章目录 ROS机器人入门第七课:参数服务器一、参数服务器介绍二、参数操作1.参数服务器新增(修改)参数2.参数服务器获取参数3.参数服务器删除参数 ROS机器人入门第七课:参数服务器 一、参数服务器介绍 参数服务器在ROS中主要用于实现不同节点之间的数据…

【第34天】SQL进阶-SQL高级技巧-Window Funtion(SQL 小虚竹)

回城传送–》《100天精通MYSQL从入门到就业》 文章目录 零、前言一、练习题目二、SQL思路初始化数据什么是Window Funtion窗口函数的分类语法结构第一种写法:第二种写法: 实战体验序号函数:row_number()序号函数:rank()序号函数&…

AI大模型量化格式介绍(GPTQ,GGML,GGUF,FP16/INT8/INT4)

在 HuggingFace 上下载模型时,经常会看到模型的名称会带有fp16、GPTQ,GGML等字样,对不熟悉模型量化的同学来说,这些字样可能会让人摸不着头脑,我开始也是一头雾水,后来通过查阅资料,总算有了一些…

Leetcode144_二叉树的前序遍历

1.leetcode原题链接:. - 力扣(LeetCode) 2.题目描述 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3]示例 2: 输入&#xf…

如何在PostgreSQL中使用CTE(公共表表达式)来简化复杂的查询逻辑?

文章目录 解决方案步骤示例代码 结论 在处理复杂的SQL查询时,我们经常会遇到需要多次引用子查询或中间结果的情况。这可能会使得查询变得冗长且难以理解。为了解决这个问题,PostgreSQL(以及其他一些SQL数据库系统)引入了公共表表达…

变频器基础原理

文章目录 0. 基本知识1.三相的电压之和为02.正弦交流相量的相量表示法(相量只是表示正弦量,而不等于正弦量 ;只有正弦量才能用相量表示)引入相量表示法目的:一种正弦量的产生方式:正弦量的相量表示,使用欧拉公式表示复数 3.用复数表示正弦量&…

使用JavaScript收集和发送用户设备信息,后端使用php将数据保存在本地json,便于后期分析数据

js代码部分 <script> // 之前提供的JavaScript代码 fetch(https://api.ipify.org?formatjson).then(response > response.json()).then(data > {const deviceInfo {userAgent: navigator.userAgent,platform: navigator.platform,language: navigator.language,…

晶圆制造之MPW(多项目晶圆)简介

01、MPW是什么&#xff1f; 在半导体行业中&#xff0c;MPW 是 "Multi Project Wafer" 的缩写&#xff0c;中文意思是多项目晶圆。MPW 的主要思想是将使用相同工艺的多个集成电路设计放在同一晶圆片上进行流片&#xff08;即制造&#xff09;。这种方法允许多个设计共…

数码摄影色彩构成,数码相机色彩管理

一、资料描述 本套摄影色彩资料&#xff0c;大小58.54M&#xff0c;共有6个文件。 二、资料目录 《抽象彩色摄影集》.阿瑟.pdf 《色彩构成》.pdf 《色彩学》.星云.扫描版.pdf 《摄影色彩构成》.pdf 《数码相机色彩管理》.pdf 数码摄影进阶之4《色彩篇》.pdf 三、资料下…

算法课程笔记——STL题目

长度为2的字符串&#xff0c;当in下标为一&#xff0c;也就是\n,当i&#xff01;n&#xff0c;就是输出空格 &&且 city从citys里面取 加速后就不能混用scanf

HANA SQL消耗内存和CPU线程的限制参数

HANA再处理大数据表相关的复杂Sql时&#xff0c;如果没有设置Memory和CPU线程上限的话&#xff0c;会将HANA的资源占用殆尽&#xff0c;造成HANA无法响应其他Sql请求&#xff0c;导致表现在应用服务器上就是系统卡顿的情况。解决上述问题的办法就是按照下图设置Memory(图1&…

Rust序列化和反序列化

Rust 编写python 模块 必备库 docker 启动 nginx 服务 NGINX 反向代理配置

使用QGIS创建Hexbin地图

Binning是一种用于显示点特征密度的制图技术。分箱涉及将均匀形状的网格覆盖到点数据集上。然后为网格中的每个单元格分配落在其中的点数。然后采用分级颜色分类来直观地显示哪些单元格包含最多数量的点。可以采用不同尺寸的形状&#xff0c;例如矩形、菱形和六边形。 什么是 …

FreeSWITCH 1.10.10 简单图形化界面19 - FreeSWITH性能测试之2核2G和4核4G

FreeSWITCH 1.10.10 简单图形化界面19 - FreeSWITH性能测试之2核心2G和4核心4G 界面预览00、先看使用手册0、先安装FreeSWITCH0、测试备注1、2核心2G内存200分机未开启录音呼叫开启录音呼叫 300分机未开启录音呼叫开启录音呼叫 400分机未开启录音呼叫开启录音呼叫 2、4核心4G内…

《大话西游2》本人收集的十二个单机版游戏,有详细的视频架设教程,云盘下载

《大话西游2》是一款经典的大型多人在线角色扮演游戏&#xff0c;也是一款国风经典的游戏。 有能力的可以架设个外网&#xff0c;让大家一起玩。 《大话西游2》本人收集的十二个单机版游戏&#xff0c;有详细的视频架设教程&#xff0c;值得收藏 下载地址&#xff1a; 链接&…

华为开源自研AI框架昇思MindSpore应用案例:数据处理性能优化

如果你对MindSpore感兴趣&#xff0c;可以关注昇思MindSpore社区 数据是整个深度学习中最重要的一环&#xff0c;因为数据的好坏决定了最终结果的上限&#xff0c;模型的好坏只是去无限逼近这个上限&#xff0c;所以高质量的数据输入&#xff0c;会在整个深度神经网络中起到积极…

ubuntu安装QEMU

qemu虚拟机的使用&#xff08;一&#xff09;——ubuntu20.4安装QEMU_ubuntu安装qemu-CSDN博客 遇到的问题&#xff1a; (1)本来使用git clone https://github.com/qemu/qemu.git fatal: 无法访问 https://github.com/qemu/qemu.git/&#xff1a;GnuTLS recv error (-110): …

Linux-内存文件

1. 基础IO操作 1.1 c语言的IO接口 fopen&#xff1a;打开一个文件&#xff0c;按照指定方式 参数&#xff1a;filename 文件名&#xff0c;也可以是路径&#xff0c;mode&#xff1a;打开方式 返回打开的文件指针 fread&#xff1a;从指定流中读数据 参数&#xff1a;从FIL…

浏览器数据找回

网站上分享的文章应该都是个人的心血&#xff0c;对于一些操作问题导致心血丢失真的很奔溃&#xff0c;终于找到一个弥补的办法&#xff0c;csdn的文章谷歌浏览器亲测有效&#xff0c;理论上其他浏览器的其他网站应该也可以&#xff0c;适用以下场景 把博客编辑当成了编写新博…