1.5 JAVA程序运行的机制


**1.5 Java程序的运行机制**
---
**简介:** Java程序的运行涉及两个主要步骤:编译和运行。这种机制确保了Java的跨平台特性。
**主要内容:**
1. **Java程序的执行过程**:
- **编译**:首先,扩展名为.java的源文件被编译为扩展名为.class的字节码文件。例如,`javac HelloWorld.java`命令用于编译Java源文件,产生HelloWorld.class字节码文件。
- **运行**:Java虚拟机(JVM)解释并执行.class文件,输出运行结果。例如,使用`java HelloWorld`命令可以运行HelloWorld.class文件。此过程包括类加载(由类加载器完成)和字节码的解释执行。
2. **跨平台特性**:
- **独立于操作系统**:Java程序是由JVM负责解释和执行的,而不是直接由操作系统执行。这使得Java程序可以在任何装有JVM的设备上运行。
- **JVM的多版本**:不同的操作系统需要不同版本的JVM,例如Windows上的JVM、Linux上的JVM等(如图1-24所示)。这确保了Java程序可以在各种操作系统上运行,只要相应的JVM已经被安装。
- **跨平台优势**:Java程序的这种特性解决了传统编程中在不同操作系统上产生不同机器代码的问题,从而减少了开发和维护的难度和成本。
---
**结论**:Java的“编写一次,到处运行”的理念得益于其独特的运行机制。程序员只需编写一次代码,然后可以在任何支持JVM的平台上运行它,这极大地提高了开发效率并降低了维护成本。
我的理解:
Java程序执行的过程是一个从源代码到机器指令的转换和执行过程。为了更好地理解这一过程,我们可以将其分解为以下几个步骤:
1. **编写源代码**:程序员使用Java语言编写程序,并将其保存为扩展名为`.java`的文件。这个文件包含了用Java编写的类和方法。
2. **编译**:
- 当你使用`javac`命令(Java编译器)编译一个`.java`文件时,它将高级Java源代码转换为中间级别的字节码。
- 字节码是一种特定于Java的指令集,保存在扩展名为`.class`的文件中。
3. **加载**:
- 当你运行一个Java程序时,类加载器首先将这些`.class`文件(字节码)加载到JVM的内存中。
- 加载包括从文件系统找到这些文件并将它们读入JVM中。
4. **字节码验证**:
- 为了确保字节码文件的完整性和安全性,JVM会进行字节码验证。这是为了确保没有人修改了字节码,以及它不会损害机器的内存或操作系统。
5. **解释/编译**:
- 一旦字节码被加载到JVM中,就解释或编译这些字节码以产生机器指令。
- **解释器**:它会逐条解释字节码并执行。这种方式效率较低。
- **JIT编译器**:Java也有一个称为“即时编译器”(Just-In-Time compiler, JIT)的组件,它会将热点代码(经常执行的代码)编译为机器语言,这样它们可以更快地执行。
6. **运行**:
- 机器指令在物理硬件上执行,实现Java代码定义的功能。
- 这一过程在JVM的管理和控制下进行,确保了平台独立性和安全性。
**重要点**:Java的这种编译-解释执行的双阶段过程使其能够实现“编写一次,到处运行”的特点。源代码只需编写并编译一次,生成的字节码可以在任何JVM上运行,而不考虑底层的硬件和操作系统平台。
简而言之,Java程序执行的过程是从Java源代码开始,经过编译成字节码,然后由JVM解释或编译为机器代码,最后在物理硬件上执行。
比喻:
让我们使用一个比喻来形象地理解Java程序执行的过程。
### 比喻:从食谱到烹饪
1. **编写源代码**:想象你正在读一个食谱,这食谱上写着如何制作一道美味的料理。这食谱就好比是Java源代码,告诉我们如何实现一个程序。
2. **编译**:现在,你决定将这个食谱翻译成另一种语言,让国外的朋友也能看懂。这个翻译的过程就像Java的编译过程,将`.java`文件转换成`.class`文件(字节码)。
3. **加载**:你的朋友收到了这个翻译后的食谱并准备开始做饭。首先,他会从书架上拿下食谱并放到厨房的桌子上,这就是类加载器将`.class`文件加载到JVM的过程。
4. **字节码验证**:在开始烹饪之前,你的朋友决定检查一下食谱的所有步骤,确保没有任何可能导致食物中毒或者火灾的错误。这就是字节码验证的过程,确保字节码是安全的。
5. **解释/编译**:现在,你的朋友开始按照食谱的指示烹饪。如果他是按照食谱的每一个步骤一个接一个地操作,这就是**解释**。但如果他首先理解整个食谱,然后将其转化为更高效的烹饪步骤,这就是**即时编译**。
6. **运行**:最终,食物被做好并上桌。这就是程序运行的过程,产生的输出(或效果)就如同烹饪的最终成品。
所以,Java程序执行的过程就好像烹饪食物。从一开始的食谱到最后上桌的料理,经历了一系列精心准备和执行的步骤。
相关文章:
1.5 JAVA程序运行的机制
**1.5 Java程序的运行机制** --- **简介:** Java程序的运行涉及两个主要步骤:编译和运行。这种机制确保了Java的跨平台特性。 **主要内容:** 1. **Java程序的执行过程**: - **编译**:首先,扩展名为.jav…...
基于FPGA的拔河游戏设计
基于FPGA的拔河游戏机 设计内容: (1)拔河游戏机需要11个发光二极管排成一行,开机 后只有中间一个亮点,作为拔河的中间线。 游戏双方 各持一个按键,迅速且不断地按动产生脉冲,哪方按 得快,亮点就向哪方移动, 每按一次,亮点移动一次。 移到任一方二极管的终端,该方就…...
关联规则挖掘(下):数据分析 | 数据挖掘 | 十大算法之一
⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…...
8、【Qlib】【主要组件】预测模型:模型训练和预测
8、【主要组件】预测模型:模型训练和预测 简介基本类Example简介 预测模型(Forecast Model)旨在对股票做出预测评分。用户可以通过 qrun 在自动化工作流中使用预测模型。 由于 Qlib 中的组件设计成了松耦合方式,预测模型也可以作为一个独立模块使用。 基本类 Qlib 提供了…...
kettle安装
kettle安装 安装java环境 mkdir /data/java ln -s /data/java/ /opt/ cd /opt/javatar zxvf jdk-8u171-linux-x64.tar.gz#java export JAVA_HOME/opt/java/jdk1.8.0_171 export JRE_HOME$JAVA_HOME/jre export CLASSPATH$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH$J…...
基于生物地理学优化的BP神经网络(分类应用) - 附代码
基于生物地理学优化的BP神经网络(分类应用) - 附代码 文章目录 基于生物地理学优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.生物地理学优化BP神经网络3.1 BP神经网络参数设置3.2 生物地理学算法应用 4…...
第二证券:买基金1w一个月能赚多少?
跟着经济的开展和出资观念的改动,越来越多的人开始出资基金,购买基金已成为普遍且盛行的出资方式之一。在这个商场中,人们最重视的问题莫过于“买基金1w一个月能赚多少?”本文将从多个角度分析这一问题,协助出资者更全…...
蓝桥杯每日一题2023.10.7
跑步锻炼 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 简单枚举,对于2的情况特判即可 #include<bits/stdc.h> using namespace std; int num, ans, flag; int m[13] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; bool is_ren(int n) {if((n %…...
Linux 系统为何产生大量的 core 文件?
Author:rab 目录 一、问题分析二、解决方案扩展 一、问题分析 上一篇刚讲到《Docker 配置基础优化》,这里再补充一下。就在中秋国庆这段小长假里,接收到了线上服务器磁盘告警通知,线上服务器架构是一个 Docker Swarm 集群&#x…...
Web_python_template_injection SSTI printer方法
这题挺简单的 就是记录一下不同方法的rce python_template_injection ssti了 {{.__class__.__mro__[2].__subclasses__()}} 然后用脚本跑可以知道是 71 {{.__class__.__mro__[2].__subclasses__()[71]}} 然后直接 init {{.__class__.__mro__[2].__subclasses__()[71].__i…...
TCP/IP网络江湖——江湖导航(网络层上篇)
目录 一、引言 二、IP地址与路由 三、IP协议与数据包转发 3.1 IP协议:网络江湖的规矩...
数据结构——AVL树(详解 + C++模拟实现)
文章目录 前言AVL树的概念AVL树节点的定义AVL树类框架AVL树的插入AVL树的旋转新节点插入较高子树的左侧 —— 左左: 右单旋新节点插入较高右子树的右侧——右右: 左单旋新节点插入较高左子树的右侧 —— 左右: 先左单旋然后再有单旋新节点插入较高右子树的左侧&…...
redis 雪崩,穿透,击穿及解决方案
一、缓存雪崩: 1. 原因: 缓存雪崩是指在我们设置缓存时大量采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。 2. 解决方案: 将失效时间分散,通过生成随机数使得key的过期时间…...
Flutter环境搭建及新建项目
一、下载安装压缩包 https://storage.flutter-io.cn/flutter_infra_release/releases/stable/windows/flutter_windows_3.10.6-stable.zip 二、解压缩 解压之后,将里面的flutter整体拿出来 三、配置环境变量 将flutter/bin全路径配置到系统环境变量里面 四、运行…...
【面试题精讲】深拷贝和浅拷贝区别了解吗?什么是引用拷贝?
“ 有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top ” 首发博客地址[1] 面试题手册[2] 系列文章地址[3] 深拷贝和浅拷贝的区别: 深拷贝(Deep Copy)和浅拷贝&#…...
CentOS7.9中使用packstack安装train版本
这里写目录标题 材料准备为什么选择packstack安装静态ip系统配置使用阿里云yum源安装packstack部署openstack 材料准备 ecs云服务器8核心16g内存一台,系统盘100GB,系统CentOS7.9vpc网段:192.168.0.1/24eip一个,带宽5M以上 为什么…...
mfw git泄露构造闭合
这题也挺有想法 第一次确实没有想到 首先我们可以扫出 git 然后 我们githack 泄露一下 然后我们看index.php代码 <?phpif (isset($_GET[page])) {$page $_GET[page]; } else {$page "home"; }$file "templates/" . $page . ".php";/…...
UE5修改导航网格的参数
Unreal Engine 4 - Recast NavMesh Size, how to Change Agent Radius / Tutorial - YouTubehttps://www.youtube.com/watch?vf3hF6xdmCTk 修改当前的 代理半径就是一般贴边的长度 修改编辑器的...
郁金香2021年游戏辅助技术中级班(七)
郁金香2021年游戏辅助技术中级班(七) 058-C,C写代码HOOK分析封包数据格式A059-C,C写代码HOOK分析封包数据格式B-detours劫持060-C,C写代码HOOK分析封包数据格式C-过滤和格式化061-C,C写代码HOOK分析封包数据格式D-写入配置文件062-C,C写代码HOOK分析封包…...
【网络】路由器和交换机的区别
🍁 博主 "开着拖拉机回家"带您 Go to New World.✨🍁 🦄 个人主页——🎐开着拖拉机回家_Linux,大数据运维-CSDN博客 🎐✨🍁 🪁🍁 希望本文能够给您带来一定的帮助…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
