【Java】什么是 Java 虚拟机 (JVM)

news2024/12/28 20:26:01

本文仅供学习参考!
相关教程(文章)地址:
https://zhuanlan.zhihu.com/p/34426768
https://github.com/doocs/jvm

Java 虚拟机 (JVM) 是 Java 编程语言的关键组件,为跨大多数主要硬件、操作系统和软件架构执行 Java 代码提供了一个独立于平台的环境。在本文,我们将讨论 JVM 是什么、它如何工作以及它为开发人员提供的主要功能。

什么是 JVM?

Java面试题 JVM概念

Java虚拟机是一个虚拟“机器”,为Java应用程序和程序提供运行时环境。它的作用很简单:解释并执行 Java字节码,它是一段 Java 代码的编译形式的低级表示。当编译用 Java 编写的应用程序时,它们会生成字节码,字节码可以由任何 JVM 实现执行(或运行),而不管底层体系结构、硬件或操作系统如何。

Java 的 JVM 是平台无关的,这意味着 Java 程序可以编写一次并在任何 JVM 实现上运行 - 这一原则称为WORA编写一次,在任何地方运行。WORA 的这一概念是通过 Java 代码与底层操作系统和硬件之间的抽象层实现的。在运行时,JVM 解释生成的字节码并将其转换为本机机器代码,考虑到它将运行的底层系统的特征。

Java虚拟机如何工作?

回答“JVM 是如何工作的?”这个问题。开发人员必须首先了解 JVM 遵循的步骤,以便解释 Java 代码,然后执行它。这些步骤包括:

  • 加载字节码
  • 验证字节码
  • 准备内存资源
  • 解释 Java 字节码
  • 即时编译
  • 垃圾收集

加载Java字节码

JVM 进程中发生的第一步涉及将 Java 字节码加载到 JVM 中。此任务由类加载器执行,其职责是找到任何必要的字节码文件并将它们加载到系统内存中。

确认

字节码加载到内存后,JVM 需要验证其正确性,方法是检查 Java 字节码是否违反 Java 语言规范,包括非法访问私有字段或私有方法。

准备字节码

一旦验证了字节码,Java 虚拟机就会准备执行程序所需的内存和资源。此准备工作包括为任何所需对象分配内存以及初始化静态变量。

解释Java字节码

接下来,JVM 必须解释字节码并顺序执行每条指令。执行每条指令时,JVM 会维护一个值堆栈,以供任何后续指令集使用。

即时编译

一旦代码被解释,JVM 就可以使用即时 (JIT) 编译来提高性能。在 JIT 编译过程中,JVM 将频繁执行的字节码编译为本机机器语言,其执行效率比解释的字节码更高。我们将在下面的部分中更详细地讨论 JIT。

垃圾收集

当应用程序执行时,Java 虚拟机通过执行自动垃圾收集来管理内存资源(分配和释放) 。垃圾收集会释放程序或 CPU 不再使用的内存资源,从而允许 JVM 回收这些内存并用于其他用途。

JVM 有哪些特点?

Java 虚拟机有几个关键特性,使其成为一个如此强大且宝贵的平台,包括平台独立性内存管理安全性动态加载JIT 编译多线程

  • 平台独立性: JVM 包括一个独立于平台的运行时环境,允许在大多数硬件和软件架构上执行 Java 应用程序。
  • 内存管理: JVM 通过其内置的垃圾收集器自动管理内存,当程序完成时会释放内存,从而使开发人员不必考虑内存分配和释放。
  • 安全性: JVM 强制执行安全策略以防止恶意代码获取对系统资源的访问权限。
  • **动态加载:**使用 Java 虚拟机,可以在运行时动态加载类,从而使开发人员可以扩展其 Java 程序的功能,而无需重新编译或重新部署。
  • 即时编译: JIT 编译通过将频繁执行的字节码编译为本机机器语言来提高应用程序性能。
  • 多线程: JVM 支持多线程,它允许 Java 程序同时运行多个执行线程。

什么是JIT?

正如所讨论的,JIT 是一种编译机制,可让 JVM 在运行时将频繁执行的字节码编译为本机机器语言。在执行 Java 应用程序期间,JVM 解释字节码并一次执行一条指令。这个过程可能很慢而且不是最优的,这就是 JIT 发挥作用的地方。

即时编译通过动态编译频繁执行的字节码,将其更改为本机机器代码来提高性能,这比解释的对应版本要高效得多。该本机代码存储在内存中,并在执行相同代码时重复使用,这进一步提高了应用程序性能。

JIT 如何运作?

如上所述,当执行 Java 程序时,JVM 会解释字节码并按顺序执行,一次一条指令。在此过程中,如果 JVM 检测到某段代码被频繁执行,它就会开始将该频繁使用的代码编译为本机机器代码。

JIT 编译器可以通过使用多种技术来优化编译代码的性能。例如,可以采用循环展开来消除循环控制结构的开销。内联方法可用于消除与方法调用相关的开销。

JIT有什么好处?

JIT 为 Java 开发人员提供了多种好处,包括改进的性能、更快的启动时间、自适应优化、平台独立性和共享编译代码:

  • **提高性能:**通过将频繁执行的字节码动态编译为本机机器代码来提高性能。

  • **更快的启动时间:**由于 JVM 仅编译频繁执行的代码,因此 Java 应用程序的启动时间要快得多。

  • **自适应优化:**JIT 编译器根据特定程序的执行配置文件调整代码优化策略,这有助于提高性能。

  • 平台无关性: JIT编译让Java程序可以在许多不同的硬件和软件系统上运行,而不需要重新编译。

  • **代码共享:**由于编译后的代码存储在内存中并在后续执行时重用,因此 JIT 允许同一程序的多个实例共享编译后的代码。此操作有助于减少内存使用和资源。

END

在本文,我们了解了 Java 虚拟机 (JVM),以及它的工作原理、特性和优点。这包括为 Java 程序的运行提供一个独立于平台的运行时环境,无论它们部署在哪个系统上。JVM 解释 Java 字节码并在运行时将其转换为本机机器代码。

我们还讨论了 JIT 编译,它让 JVM 通过将频繁执行的字节码动态编译为本机机器代码来提高 Java 应用程序的性能。该技术提高了性能,减少了启动时间,采用自适应优化,提供平台独立性,并允许代码共享。

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

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

相关文章

在Windows上编译和调试CoreCLR

生成CoreCLR - Windows篇 本文的唯一目的就是让你运行Hello World 运行环境 Window 7 Visual studio 2015 确保C 工具已经被安装,默认是不安装的,所以要选择自定义模式,VS 2015 精简版不支持。 CMake 下载 CMake for windows,并把Cmak…

LeetCode刷题 | 518. 零钱兑换 II、377. 组合总和 Ⅳ、

518. 零钱兑换 II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 …

Python学习——集合

一、集合的定义 集合也是Python语言所提供的内置数据结构,集合与列表、字典一样都属于可变类型的序列,集合是没有value的字典,所以集合也是无序的。 二、集合的创建 方式一:使用大括号进行创建 #使用大括号创建结合 s{1,3,5,7,9}…

STM32H743 SOEM EtherCAT基于STM32H743芯片和SOEM的EtherCAT主站源码

一个基于STM32H743芯片和SOEM协议栈的EtherCAT主站源码。该源码提供了配套的CUBE工程,使用的是SOEM协议栈的1.3.1版本。此外,还可以使用NUCLEO-H743ZI开发板进行配套开发。该系统支持DC同步,并且可以与多种驱动器型号配合使用,包括…

VC++添加一般类

VC6新建一个单文档工程; 然后从菜单中选择 插入类;弹出下图对话框;选择类的类型为 Generic Class; 输入类名; 确定之后,会生成一个.h文件,一个.cpp文件;包含基本的构造和析构函数&…

Day07

目录 1、使用JsonIgnoreProperties 2、前端日期字符串转换LocalDateTime异常 1、使用JsonIgnoreProperties 在做项目时把前端的JSON对象转为dto对象时,出现了异常 Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse er…

go-cqhttp签名服务sign-server的本地搭建

新版go-cqhttp新增签名服务器签名服务器相关问题 Issue #2242 Mrs4s/go-cqhttp GitHubhttps://github.com/Mrs4s/go-cqhttp/issues/2242 其在win10系统下本地化搭建的方式为: 1.解压缩qq安装包提取lib里面的libfekit.so、libQSec.so文件并存放至一个文件夹&…

【Vue3】CustomImport 导入文件组件

1. 效果图 2. 组件完整代码 <template><div class"custom-import-warpper"><el-dialog v-model"dialogVisible" :title"dialogTitle" width"600px" :close-on-click-modal"false"><el-form label-wid…

SAP从入门到放弃系列之报废率-主数据维护-Scrap

文章目录 一、前言二、场景概述&#xff1a;三、报废的类型&#xff1a;3.1、装配报废3.2、组件报废3.3、工序报废-料废3.4、工序报废-工废 四、数据维护&#xff1a;4.1、装配报废&#xff08;Assembly scrap&#xff09;4.2、组件报废(Component scrap)4.3、工序报废-料废(Op…

windows环境使用cmake配置pcl

安装环境 cmake版本&#xff1a;cmake-3.26.3-windows-x86_64 pcl版本&#xff1a;PCL 1.13.1 vs版本&#xff1a;vs2022 配置流程 cmake编译准备&#xff1a;新建两个文件夹source和cmake_bin。source用于存放.cpp文件和CMakeLists.txt 文件&#xff1b;cmake_bin存放配置生…

【NLP】理解LSTM的内在逻辑

一、说明 在学习RNN的时候,多少有些东西可以作为实例进行原理性实践;而进入LSTM时代,短小的能说明原理的案例实验并不多,相反,对此的参考文献却海啸般地到来,让人来不及消化;本文是万篇论文之一,因其叙述的独特性,被我选入介绍给大家。 二、从循环神经网络说起 人类并…

LeetCode刷题 | 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c; 且 x < y。那么粉碎的可能结…

死信是什么,如何运用RabbitMQ的死信机制?

系列文章目录 手把手教你&#xff0c;本地RabbitMQ服务搭建&#xff08;windows&#xff09; 消息队列选型——为什么选择RabbitMQ RabbitMQ 五种消息模型 RabbitMQ 能保证消息可靠性吗 推或拉&#xff1f; RabbitMQ 消费模式该如何选择 死信是什么&#xff0c;如何运用Rabbit…

使用影刀RPA合并excel数据

合并不同sheet&#xff1a; 先获取不同sheet中的表头&#xff0c;合并所有表头并去重存作列表&#xff0c;新建excel在第一行插入该表头数据,作合并数据存放使用循环方法&#xff0c;依次获取每个sheet的数据&#xff0c;用if判断表头是否在1的列表中&#xff0c;在的话则将整…

618技术揭秘:探究竞速榜页面核心前端技术 | 京东云技术团队

前言 H5页面作为移动端Web应用的重要形式之一&#xff0c;已经成为了现代Web开发的热门话题。在H5页面的开发过程中&#xff0c;前端技术的应用至关重要。本文将探究京东竞速榜H5页面的核心前端技术&#xff0c;包括动画、样式配置化、皮肤切换、海报技术、调试技巧等方面&…

easyX库图像处理相关函数

0.图像处理相关函数与类型概览 您好&#xff0c;这里是limou3434&#xff0c;本次我将给您带来的是easyX的图像处理相关接口。 如果您感兴趣也可以看看我的其他内容。 函数或数据类型描述IMAGE保存图像的对象。loadimage读取图片文件。putimage在当前绘图设备上绘制指定图像…

10--Gradle进阶 - Gradle任务的执行

10--Gradle进阶 - Gradle任务的执行 前言 在前面的篇章中&#xff0c;我们尝试执行了 gradle 的 task&#xff0c;但是不清楚有哪些语法&#xff0c;下面来介绍一下。 任务执行 任务执行语法&#xff1a;gradle [taskName...] [--option-name...]。 分类解释常见的任务&#xf…

沉浸式三维虚拟展厅交互体验科技感十足

随着科技的不断发展进步&#xff0c;展厅的表现形式也变得多样化&#xff0c;紧跟时代发展步伐&#xff0c;迭代创新。 3D虚拟展厅具有四大优势 一、降低成本&#xff0c;提高效率 3D“VR线上展厅”将艺术优势资源转到线上搭建的艺术线上展平台&#xff0c;相对传统艺术展来说有…

ModaHub魔搭社区:详解向量数据库Milvus的Mishards:集群分片中间件(二)

目录 元数据 服务发现 元数据 元数据记录了底层数据的组织结构信息。在分布式系统中&#xff0c;Milvus 写节点是元数据唯一的生产者&#xff0c;而 Mishards 节点、Milvus 写节点和读节点都是元数据的消费者。目前版本的 Milvus 只支持 MySQL 和 SQLite 作为元数据的存储后…

SpringBoot整合网易邮箱

SpringBoot整合邮箱 1&#xff0c;开启POP3/SMTP/IMAP服务 注意&#xff1a;每个邮箱的密码唯一&#xff0c;不要随意分享给他人 最后就是这个样子了 2&#xff0c;整合测试 2.1&#xff0c;pom.xml <?xml version"1.0" encoding"UTF-8"?> <…