Java --- JVM编译运行过程

news2025/1/10 16:41:14

目录

一.Java编译与执行流程:

二.编译过程:

1.编译器(javac):

2.字节码文件(.class):

三.执行过程:

1.启动JVM(Java虚拟机):

2.类加载:        

 3.字节码执行:

4.JVM内存模型:

5.垃圾回收(GC):

6. Java运行时的执行引擎:


Java是将代码编译成一种“字节码”,它类似于抽象的CPU指令,然后针对不同平台编写虚拟机,不同平台的虚拟机负责加载字节码并执行,这样就实现了“一次编写,到处运行”的效果。当然,这是针对Java开发者而言。对于虚拟机,需要为每个平台分别开发。为了保证不同平台、不同公司开发的虚拟机都能正确执行Java字节码,SUN公司制定了一系列的Java虚拟机规范。从实践的角度看,JVM的兼容性做得非常好,低版本的Java字节码完全可以正常运行在高版本的JVM上。 

Java源码本质上是一个文本文件,我们需要先用javacHello.java编译成字节码文件Hello.class,然后,用java命令执行这个字节码文件:

 

因此,可执行文件javac是编译器,而可执行文件java就是虚拟机。

Java程序的编译和运行涉及到多个阶段和不同的组件,最重要的是Java虚拟机(JVM)的角色,它在程序运行时负责执行字节码。理解Java程序的编译、运行流程及其如何与JVM交互是掌握Java开发的基础。 

一.Java编译与执行流程:

  1. 由开发者编写.java源代码文件。
  2. Java编译器(javac)将.java源代码文件编译成字节码文件(.class),字节码文件包含平台无关的指令,JVM能够理解并执行这些指令。
  3. JVM通过类加载器(ClassLoader)加载 .class 文件。
  4. 字节码被JVM解释执行,或者通过JIT(即时编译器)转化为本地机器代码。(将字节码转换为机器码,从而提高程序的执行效率)
  5. JVM根据需求进行垃圾回收,自动管理内存以及回收不再使用的对象。

二.编译过程:

当我们编写Java程序并运行javac命令时,Java编译器将源代码(.java文件)编译成字节码(.class文件)。字节码并不是针对某个特定机器的机器码,而是与平台无关的中间代码。这是Java的跨平台性("Write Once, Run Anywhere")的关键所在。字节码并没有直接针对硬件或操作系统进行优化,因此它不能直接被CPU执行。 

Java程序首先由Java编译器(javac)编译成字节码(字节码文件(.class文件)是与平台无关的指令,而JVM可以理解并执行)。这个过程包括:

  • 语法分析(Parsing):将源代码(.java文件)转换为抽象语法树(AST)。
  • 符号解析(Symbol Resolution):通过符号表解析类、方法、变量的名称等。
  • 字节码生成(Bytecode Generation):将抽象语法树转换为字节码指令,生成 .class 文件。
javac HelloWorld.java

编译后会生成一个字节码文件 HelloWorld.class。这个文件包含了Java源代码的字节码,JVM可以加载并执行它。

三.执行过程:

1.启动JVM(Java虚拟机):

JVM的执行由Java启动类(通常是java命令)来启动。

java HelloWorld

java命令启动JVM并传递应用程序的主类(HelloWorld)给JVM。

2.类加载:        

当我们运行Java程序时,JVM会使用类加载器(ClassLoader)加载.class文件。JVM并不会直接执行.class文件,而是解析并执行其字节码。JVM将字节码转化为机器码后执行。 

JVM使用类加载器(ClassLoader)加载 .class文件。加载过程包括以下几个步骤:

  1. 加载:从文件系统、网络、或者其他位置加载字节码文件。
  2. 链接:包括验证(确保字节码格式正确)、准备(为类变量分配内存)和解析(解析符号引用)。
  3. 初始化:执行类的静态初始化块(static块)和静态变量的初始化。

JVM有三种主要的类加载器:

  • Bootstrap ClassLoader:负责加载核心类库,如rt.jar中的类。
  • Extension ClassLoader:加载Java扩展库(如ext目录中的库)。
  • Application ClassLoader:负责加载应用程序类路径下的类。

 3.字节码执行:

一旦类被加载,JVM会执行字节码。

执行字节码方式:

  • 解释执行

    • JVM中的解释器逐条解释字节码指令,并将其翻译成机器码执行。
    • 这种方式灵活但较慢,因为每条指令都需要在每次执行时解释一次。
  • JIT编译(即时编译)

    • JIT编译器会在程序运行时,动态地将热点代码(频繁执行的代码)编译成机器码。
    • JIT优化性能,将程序中的热路径(经常执行的代码)编译为本地机器代码,以避免每次执行时都需要解释。(机器码是与硬件相关的,并且执行速度更快。)
    • 即时编译器(JIT)是JVM的一部分,它在程序运行时将热点代码(频繁执行的部分)从字节码转换成机器码,并将这些机器码存储在内存中以便后续直接执行。JIT编译通常会选择一些最常调用的代码块进行编译,从而优化程序的执行速度。
    • JIT能够根据程序的实际运行情况进行优化(如内联、死代码消除等),进一步提高性能。

.class文件内容:

  • 常量池(Constant Pool):存储了类、方法、字段等的引用。
  • 字段表(Field Table):包含了类中所有字段的定义。
  • 方法表(Method Table):包含了类中所有方法的定义。
  • 字节码:具体的指令集,表示类中的方法的操作步骤。

JVM执行这些指令时会根据当前系统平台生成机器代码。字节码指令类似于汇编语言,但它们并非直接执行,而是由JVM的解释器或JIT(即时编译器)执行。

字节码与机器码的区别:

  • 字节码:Java源代码通过javac编译器编译后生成的中间代码,平台无关,能够在任何安装了JVM的操作系统上运行。字节码是一种虚拟机指令,JVM根据这些指令执行程序的逻辑。

  • 机器码:是特定硬件平台能够直接理解和执行的指令集。每种硬件平台(如x86、ARM等)都有其专用的机器码格式。因此,机器码是与硬件相关的,并且执行速度更快。

字节码到机器码:

  • 字节码是一种平台无关的中间代码,它不能直接由硬件执行。
  • JIT编译是JVM将字节码转换为平台特定的机器码的过程。通过将热点代码编译为机器码,JIT提高了Java程序的执行性能。
  • 解释执行JIT编译是JVM在字节码执行中的两种主要方式,JIT会根据代码的执行频率将热点代码编译为机器码,避免了每次执行时都进行字节码解释。
  • JIT优化(如方法内联、死代码消除、常量折叠等)可以进一步提升性能。

字节码转机器码的过程通过JIT技术优化了Java程序的性能,使得Java在保持平台无关性的同时,也能够接近本地代码的执行效率。

4.JVM内存模型:

JVM在程序运行时管理内存,包括以下几个主要区域:

  1. 堆(Heap)

    • 存储所有对象实例和数组。
    • 堆内存是JVM中最大的一块内存区域,由垃圾回收器(GC)负责管理内存回收。
  2. 方法区(Method Area):存储类的元数据(如类名、方法信息、字段信息等),以及静态变量。

  3. 栈(Stack)

    • 每个线程在执行时都会有一个栈,用于存储局部变量、操作栈和方法调用的相关信息。
    • 每个方法调用都会创建一个栈帧,其中存储方法的局部变量和返回地址。
  4. 程序计数器(PC Register):每个线程都有一个程序计数器,指示当前正在执行的字节码指令的地址。

  5. 本地方法栈(Native Method Stack):专门为本地方法(使用JNI调用的C、C++等语言编写的代码)提供的内存区域。

5.垃圾回收(GC):

Java的垃圾回收机制自动回收不再使用的对象,释放内存。JVM通过GC(垃圾回收)来管理堆内存,减少内存泄漏的风险。

GC的过程包括:

  • 标记(Mark):标记所有被引用的对象。
  • 清除(Sweep):删除所有没有被标记的对象。
  • 压缩(Compact):整理内存,确保内存空间连续。

常见的垃圾回收算法包括标记-清除标记-整理复制算法等。

6. Java运行时的执行引擎:

JVM的执行引擎负责执行字节码指令,有两种主要的执行方式:

  1. 解释器(Interpreter)

    • 解释器逐条解释并执行字节码。
    • 每次执行时都要将字节码解释成机器码,因此效率较低。
  2. JIT编译器(Just-In-Time Compiler)

    • JIT编译器在程序运行时,检测到热点代码并将其编译为机器码。
    • 热点代码会直接使用机器码执行,避免了每次解释执行。
    • JIT编译器提高了程序的执行速度,尤其是在大量重复执行的代码路径上。

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

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

相关文章

qt QNetworkAccessManager详解

1、概述 QNetworkAccessManager是QtNetwork模块中的一个核心类,它允许应用程序发送网络请求并接收响应。该类是网络通信的基石,提供了一种方便的方式来处理常见的网络协议,如HTTP、HTTPS等。QNetworkAccessManager对象持有其发送的请求的通用…

微信小程序 AI 智能名片 2+1 链动模式商城系统中的社群电商构建与价值挖掘

摘要:本文聚焦于微信小程序 AI 智能名片 21 链动模式商城系统,深入探讨社群电商在其中的构建方式与所蕴含的价值。通过剖析社群概念的内涵与发展历程,揭示其在当今电商领域备受瞩目的原因,并详细阐述如何在特定的商城系统架构下&a…

亚马逊云科技re:Invent:独一无二的云计算

美国当地时间12月2日晚,作为拥有超过6万名现场参会者和40万名线上参会者的全球云计算顶级盛宴,亚马逊云科技2024 re:Invent全球大会在拉斯维加斯盛大揭幕。 作为本届re:Invent全球大会的首场重头戏,亚马逊云科技高级副总裁Peter DeSantis的主…

计算机网络研究实训室建设方案

一、概述 本方案旨在规划并实施一个先进的计算机网络研究实训室,旨在为学生提供一个深入学习、实践和研究网络技术的平台。实训室将集教学、实验、研究于一体,覆盖网络基础、网络架构、网络安全、网络管理等多个领域,以培养具备扎实理论基础…

常量变量和一些运算符

3.4 变量 常量:!final关键字 final修饰基本类型不可以第二次赋值final修饰的引用类型不可以第二次改变指向final修饰的类不可以被继承final修饰的方法不可以被重写final防止指令重排序,遏制流水线性能优化,保障多线程并发场景下…

docker学习笔记(五)--docker-compose

文章目录 常用命令docker-compose是什么yml配置指令详解versionservicesimagebuildcommandportsvolumesdepends_on docker-compose.yml文件编写 常用命令 命令说明docker-compose up启动所有docker-compose服务,通常加上-d选项,让其运行在后台docker-co…

pytorch多GPU训练教程

pytorch多GPU训练教程 文章目录 pytorch多GPU训练教程1. Torch 的两种并行化模型封装1.1 DataParallel1.2 DistributedDataParallel 2. 多GPU训练的三种架构组织方式2.2 数据不拆分,模型拆分(Model Parallelism)2.3 数据拆分,模型…

Nginx配置https(Ubuntu、Debian、Linux、麒麟)

Ubuntu操作系统,Debian系统底层是Ubuntu,差异不大 ubuntu 安装nginx 1.安装依赖 sudo apt-get update sudo apt-get install gcc sudo apt-get install libpcre3 libpcre3-dev sudo apt-get install zlib1g zlib1g-dev sudo apt-get install openssl lib…

【组件封装】uniapp vue3 封装一个完整的Tabs(标签页)组件教程,功能由简到杂实现讲解。

文章目录 前言一、简单版Tabs代码实现: 二、下划线带动画的TabsAPI回顾:代码实现: 三、内容区域滑动切换切换动画代码实现:(2)禁用手势滑动切换(3)内容区域换为插槽 四、标签栏可滚动…

五、docker的网络模式

五、docker的网络模式 5.1 Docker的四种网络模式 当你安装docker时,它会自动创建三个网络,可使用如下命令查看: [rootlocalhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 7390284b02d6 bridge bridge lo…

生产慎用之调试日志对空间矢量数据批量插入的性能影响-以MybatisPlus为例

目录 前言 一、一些缘由 1、性能分析 二、插入方式调整 1、批量插入的实现 2、MP的批量插入实现 3、日志的配置 三、默认处理方式 1、基础程序代码 2、执行情况 四、提升调试日志等级 1、在logback中进行设置 2、提升后的效果 五、总结 前言 在现代软件开发中&…

【人工智能】深度解剖利用人工智能MSA模型

目录 情感分析的应用一、概述二、研究背景三、主要贡献四、模型结构和代码五、数据集介绍六、性能展示七、复现过程 情感分析的应用 近年来社交媒体的空前发展以及配备高质量摄像头的智能手机的出现,我们见证了多模态数据的爆炸性增长,如电影、短视频等…

MongoDB性能监控工具

mongostat mongostat是MongoDB自带的监控工具,其可以提供数据库节点或者整个集群当前的状态视图。该功能的设计非常类似于Linux系统中的vmstat命令,可以呈现出实时的状态变化。不同的是,mongostat所监视的对象是数据库进程。mongostat常用于…

Scratch教学作品 | 中国诗词大会——闯关擂台,品味诗词之美! ✨

🎓 Scratch教学作品 | 中国诗词大会——闯关擂台,品味诗词之美! 📜✨ 今天给大家推荐一款结合文化与挑战的Scratch作品——《中国诗词大会》!由zhouyq制作,这款游戏让你置身诗词的世界,通过闯关…

安全关系型数据库查询新选择:Rust 语言的 rust-query 库深度解析

在当今这个数据驱动的时代,数据库作为信息存储和检索的核心组件,其重要性不言而喻。然而,对于开发者而言,如何在保证数据安全的前提下,高效地进行数据库操作却是一项挑战。传统的 SQL 查询虽然强大,但存在诸…

微信小程序里的小游戏研发需要什么技术栈

研发小程序里的小游戏通常需要以下技术栈: 前端技术 HTML5 / CSS3:用于构建游戏的界面布局和样式。JavaScript:作为核心编程语言,实现游戏的逻辑和交互。小程序开发框架:如微信小程序的开发框架,了解其 API…

Install PyTorch (安装 PyTorch)

Install PyTorch {安装 PyTorch} 1. Install PyTorch1.1. Previous PyTorch Versions1.2. Latest PyTorch1.3. 查看 PyTorch 的版本 References 1. Install PyTorch https://pytorch.org/ Select your preferences and run the install command. Stable represents the most …

第二篇:k8s工作流程

我们来看通过deployment部署pod的常规流程: kubectl向apiserver发送部署请求(例如使用 kubectl create -f deployment.yml)apiserver将 Deployment 持久化到etcd;etcd与apiserver进行一次http通信。controller manager通过watch a…

智创 AI 新视界 -- 优化 AI 模型训练效率的策略与技巧(16 - 1)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

第五节、电机多段运动【51单片机-TB6600驱动器-步进电机教程】

摘要:本节介绍用控制步进电机三个主要参数角度、速度、方向,实现简单的步进电机多段控制 一、目标功能 输入多个目标角度,设定好步进电机速度,实现步进电机多段转动 二、计算过程 2.1 速度计算 根据第三节内容,定时器…