初识JVM(简单易懂),解开JVM神秘的面纱
目录
一、什么是JVM(Java虚拟机)?
二、JVM的功能
三、JVM的功能-即时编译
四、常见的JVM
五、JVM的组成
五、JVM的工作流程
参考资料
一、什么是JVM(Java虚拟机)?
在Java的世界里,Java虚拟机(JVM)扮演着至关重要的角色。它不仅是Java程序运行的环境,更是实现“一次编写,到处运行”的关键。本文将深入探讨JVM的核心组成部分,从类加载到执行引擎,解开JVM神秘的面纱。

JVM本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件。
JVM,即Java虚拟机,是一个用于执行Java字节码的虚拟计算机。它是在硬件或操作系统上构建的一个软件层,使Java字节码可以在不同的平台上运行。即时编译(Just-In-Time compilation)是JVM的一个关键功能,它允许JVM在运行时将字节码编译成本地代码,以提高程序的性能。
即时编译的主要功能如下:
- 预编译(Compile-Ahead-Of-Time):JVM首先将Java源代码编译成字节码,然后这些字节码在运行时被即时编译成本地代码。这种预编译的方式使得程序在第一次运行时不需要进行编译,从而提高了程序的启动速度。
- 热点代码优化:JVM通过热点代码优化技术来提高程序的运行效率。热点代码是指被频繁执行的代码。JVM在运行时收集这些热点代码的执行信息,并将它们编译成更高效的本地代码。这种优化可以显著提高程序的性能,特别是对于那些频繁运行的代码。
- 动态编译:即时编译还支持动态编译。这意味着JVM可以根据程序在运行时的行为动态地调整编译策略。例如,如果某个方法没有被频繁调用,那么JVM可以暂时不将其编译成本地代码,以节省资源。相反,如果某个方法被频繁调用,JVM可以将其优先编译成本地代码,以提高程序的运行效率。
- 内存管理和垃圾回收:JVM还提供了内存管理和垃圾回收的功能。这些功能可以帮助程序员更好地管理内存资源,并提高程序的可靠性。
总之,即时编译是JVM的一个重要功能,它可以帮助程序员提高程序的性能和可靠性。通过将Java字节码编译成本地代码,JVM可以减少解释字节码所需的时间,从而提高程序的执行速度。同时,即时编译还可以根据程序在运行时的行为动态地调整编译策略,以进一步提高程序的性能。

将字节码文件转换成计算机可以看懂的机器码文件。这就是Java虚拟机的主要功能。
二、JVM的功能

三、JVM的功能-即时编译


JVM可以将热点的代码字节指令,保存到内存中,等到再次执行时可以直接调用。

四、常见的JVM
常见的JVM包括HotSpot、JRockit、J9等。
HotSpot是较新的Java虚拟机技术,用来代替JIT(just-in-time compilation,及时编译)技术,可以大大提高Java运行的性能。HotSpot将常用的部分代码编译为本地(原生,native)代码,这样显著提高了性能。它从运行应用中采样数据,从而可以优化代码,进而得到良好性能。HotSpot引擎可以集中精力来对HotSpot代码进行深度优化,从而使这部分代码的执行更加迅捷。但它的启动时间较长。
JRockit是BEA公司开发的,可以直接运行在自家Hypervisor系统上的JRockit VM的虚拟化版本,JRockit VM不需要操作系统的支持,或者说它自己本身实现了一个专用操作系统的必要功能,如文件系统、网络支持等。
IBM J9是IBM开发的Java虚拟机,它也支持即时编译技术。

我们开发时,基本都会优先选择使用HotSpot。
五、JVM的组成
JVM主要组成有四个子系统组成:类加载系统、运行时数据区域、执行引擎、本地方法接口。
-
类加载系统(Class Loading System):
- 加载(Loading): 加载是指查找字节码文件,并创建一个Class对象的过程。字节码文件通常由Java编译器从Java源代码生成。
- 验证(Verification): 确保字节码文件符合Java语言规范,并且不包含不安全或非法的代码。
- 准备(Preparation): 为类的静态变量分配内存并设置默认初始值。
- 解析(Resolution): 将常量池中的符号引用替换为直接引用,使得各个类之间能够正确地引用。
-
执行引擎(Execution Engine):
- 解释器(Interpreter): 将字节码文件逐行解释为机器码并执行。
- 即时编译器(Just-In-Time Compiler,JIT): 将整个字节码文件编译为机器码,提高执行速度。
- 栈操作(Stack Operations): 使用操作栈进行方法调用、参数传递等。
-
本地方法接口(Native Interface):
- 允许Java应用程序调用本地方法(通常使用C或C++编写的代码)。Java的本地方法接口允许Java代码与本地库进行交互,实现了Java与其他语言的衔接。JVM通过本地库接口与操作系统提供的库进行交互,保证了Java程序的可移植性。
-
运行时数据区域(Runtime Data Area):
- 方法区(Method Area): 存储类的结构信息,如类的字段、方法信息。
- 堆(Heap): 存储对象实例,包括程序运行时创建的对象。
- 栈(Stack): 存储局部变量、方法调用和返回地址。
- 程序计数器(Program Counter): 记录当前线程执行的字节码行号。
- 本地方法栈(Native Method Stack): 执行本地方法时使用的栈。
Java程序能够在不同平台上实现“一次编写,到处运行”的特性。类加载系统负责加载和验证Java类,执行引擎负责执行Java代码,本地方法接口提供了与底层系统的交互能力,而运行时数据区域存储程序执行时的数据。JVM通过本地库接口与操作系统提供的库进行交互,保证了Java程序的可移植性。

以上图来源于黑马课件

此图来源于《深入理解Java虚拟机》
五、JVM的工作流程
JVM的工作流程通常包括以下几个步骤:
- 加载(Loading)
加载阶段是JVM启动的第一个阶段,它负责从系统中加载Java类和接口的定义信息。加载阶段的主要任务是找到并加载Java类和接口的定义信息,并将其存储在内存中。这些定义信息包括类的成员变量、成员方法、构造函数等。在加载阶段,JVM还会对类的定义信息进行验证,以确保其符合Java语言的规范。 - 链接(Linking)
链接阶段是加载阶段的后续阶段,它负责验证类的定义信息、为类的成员变量分配内存并设置默认值,以及解析类的符号引用。在链接阶段,JVM会对类进行一系列的验证,以确保其符合Java语言的规范。如果验证不通过,则会抛出异常。此外,链接阶段还会为类的成员变量分配内存并设置默认值,以及解析类的符号引用。符号引用是指用符号来引用类、方法、变量等的一种方式。 - 初始化(Initialization)
初始化阶段是链接阶段的后续阶段,它负责执行类的初始化代码。初始化阶段的主要任务是执行类的初始化代码,包括静态初始化块和静态初始化方法。在初始化阶段,JVM会执行类的静态代码块和静态变量的初始化代码。如果存在多个静态变量或静态代码块,则会按照它们在类中的顺序依次执行。 - 执行(Execution)
执行阶段是JVM的核心阶段,它负责执行Java程序的字节码指令。执行阶段的主要任务是执行Java程序的字节码指令,包括对成员变量的读写操作、方法的调用等。在执行阶段,JVM会根据程序的指令逐条执行字节码指令,从而实现Java程序的运行。 - 卸载(Unloading)
卸载阶段是JVM的最后一个阶段,它负责卸载不再被使用的Java类和接口的定义信息。卸载阶段的主要任务是回收被卸载的类占用的内存空间,以便重新被使用。在卸载阶段,JVM会回收被卸载的类占用的内存空间,以便重新被使用。
以上就是JVM的基本工作流程,不同的JVM实现可能会有一些差异,比如内存分配策略、垃圾收集器类型等。
深入了解Java虚拟机,我们不仅能够更好地理解Java程序的运行机制,还能够优化程序性能、解决内存泄漏等问题。JVM的神秘面纱下,是一个复杂而高效的执行环境,为Java的成功贡献着重要的力量。让我们在编写Java程序的同时,更加深入地认识JVM,为程序的优化和调优提供更多的可能性。
参考资料
- The Java® Virtual Machine Specification
- 深入理解Java虚拟机(第三版)
相关文章:
初识JVM(简单易懂),解开JVM神秘的面纱
目录 一、什么是JVM(Java虚拟机)? 二、JVM的功能 三、JVM的功能-即时编译 四、常见的JVM 五、JVM的组成 五、JVM的工作流程 参考资料 一、什么是JVM(Java虚拟机)? 在Java的世界里,Java虚…...
Open3D (C++) 计算两点云之间的最小距离
目录 一、 算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、 算法原理 Open3D中ComputePointCloudDistance函数提供了计算从源点云到目标点云的距离的方法,计算点云的距离。也…...
51单片机演奏兰亭序
使用开发板为普中51-实验板 普中-2 时钟频率:11.001081MHZ 演示视频: 【51单片机演奏兰亭序】 https://www.bilibili.com/video/BV12G411D7uK/?share_sourcecopy_web&vd_source0f48f7cc0fef720b95e067122ac83437 源码如下: 数组较大&a…...
计算机编程零基础编程学什么语言,中文编程工具构件简介软件下载
计算机编程零基础编程学什么语言,中文编程工具构件简介软件下载 给大家分享一款中文编程工具,零基础轻松学编程,不需英语基础,编程工具可下载。 这款工具不但可以连接部分硬件,而且可以开发大型的软件,象如…...
zookeeper单机版的搭建
一 zookeeper的搭建 1.1 上传zkjar包 1.2 搭建配置 1.解压压缩包 [rootlocalhost export]# tar -zxvf zookeeper-3.7.0-bin.tar.gz 2.创建data文件夹 [rootlocalhost export]# cd apache-zookeeper-3.7.0-bin/ [rootlocalhost apache-zookeeper-3.7.0-bin]# ls bin conf…...
roseha for windows 11+oracle 11g部署过程
文章目录 一、环境准备关闭防火墙配置hosts共享存储准备 二、部署步骤1.主机A、B安装数据库软件2.主机A进行数据库实例创建3.主机B创建数据库4.安装配置roseha软件 一、环境准备 windows server 2019 oracle 11.2.0.3 EE roseha for windows 11 5个IP地址:2心跳、3…...
机器学习与因果推断的高级实践 | 数学建模
文章目录 因果推断因果推断的前世今生(1)潜在结果框架(Potential Outcome Framework)(2)结构因果模型(Structual Causal Model,SCM) 身处人工智能爆发式增长时代的机器学…...
go语言实现高性能自定义ip管理模块(ip黑名单)
ip黑名单设计 对于IPV4而言,理论上有256^4个,也就是约42亿个。我想了好久,也查了挺多资料,但是,确实没有通用现成的解决方案。 PS:以下方案的讨论,适用于对于IP管理不那么严苛的情况。当然也可…...
检索增强生成架构详解【RAG】
生成式AI技术很强大,但它们受到知识的限制。 虽然像 ChatGPT 这样的LLM可以执行许多任务,但每个LLM的基线知识都存在基于其训练数据的差距。 如果你要求LLM写一些关于最近趋势或事件的文章,LLM不会知道你在说什么,而且回答最好是混…...
高清动态壁纸软件Live Wallpaper Themes 4K mac中文版功能
Live Wallpaper & Themes 4K mac是一款提供各种高清动态壁纸和主题的应用程序。该应用程序提供了大量的动态壁纸和主题,包括自然、动物、城市、抽象等各种类别,可以满足用户不同的需求。除了壁纸和主题之外,该应用程序还提供了许多其他功…...
Kafka配置SASL认证密码登录
1、修改config/server.properties,添加如下内容 listenersSASL_PLAINTEXT://内网ip:9092 advertised.listenersSASL_PLAINTEXT://外网ip:9092 security.inter.broker.protocolSASL_PLAINTEXT sasl.mechanism.inter.broker.protocolPLAIN sasl.enabled.…...
两年功能五年自动化测试面试经验分享
最近有机会做一些面试工作,主要负责面试软件测试人员招聘的技术面试。 之前一直是应聘者的角色,经历了不少次的面试之后,多少也积累一点面试的经验,现在发生了角色转变。初次的面试就碰到个工作年限比我长的,也没有时…...
大数据基础设施搭建 - Kafka(with ZooKeeper)
文章目录 一、简介二、单机部署2.1 上传压缩包2.2 解压压缩包2.3 修改配置文件(1)配置zookeeper地址(2)修改kafka运行日志(数据)存储路径 2.4 配置环境变量2.5 启动/关闭2.6 测试(1)查看当前服务器中的所有…...
[JVM] 京东一面~说一下Java 类加载过程
系统加载 Class 类型的文件主要三步:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。 通过全限定名来加载生成 class 对象到内存中,然后进行验证这个 class 文件,包括文件格式校验、元数据验证…...
2023 年 认证杯 小美赛 ABC题 国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析
当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。 cs数模团队在认证杯 小美赛前为大家提供了许多资料的内容呀&am…...
N-134基于java实现捕鱼达人游戏
开发工具eclipse,jdk1.8 文档截图: package com.qd.fish;import java.awt.Graphics; import java.io.File; import java.util.ArrayList; import java.util.List;import javax.imageio.ImageIO;public class Fishes {//定义一个集合来管理鱼List<Fish> fish…...
MTK联发科MT6762/MT6763/MT6765安卓核心板参数规格比较
MT6762安卓核心板 MTK6762安卓核心板是一款工业级高性能、可运行 android9.0 操作系统的 4G智能模块。 CPU:4xCortex-A53 up to 2.0Ghz/4xCortex-A53 up to 1.5GhzGraphics:IMG GE8320 Up to 650MhzProcess:12nmMemory:1xLP3 9…...
仿ChatGPT对话前端页面(内含源码)
仿ChatGPT对话前端页面(内含源码) 前言布局样式和Js部分关键点全部源码 前言 本文主要讲解如何做出类似ChatGPT的前端页面。具体我们的效果图是长这样,其中除了时间是动态的之外,其他都是假数据。接下来让我们从布局和样式的角度…...
js粒子效果(一)
效果: 代码: <!doctype html> <html> <head><meta charset"utf-8"><title>HTML5鼠标经过粒子散开动画特效</title><style>html, body {position: absolute;overflow: hidden;margin: 0;padding: 0;width: 100%;height: 1…...
程序员必备工具篇 / 程序员必备基础:Git
前言 掌握 Git 命令是每位程序员必备的基础,之前一直是用 smartGit 工具,直到看到大佬们都是在用 Git 命令操作的,回想一下,发现有些 Git 命令我都忘记了,于是写了这篇博文,复习一下~ https://github.com/whx123/JavaHome 公众号:顺哥轻创 文章目录 Git 是什么?Git …...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
网页端 js 读取发票里的二维码信息(图片和PDF格式)
起因 为了实现在报销流程中,发票不能重用的限制,发票上传后,希望能读出发票号,并记录发票号已用,下次不再可用于报销。 基于上面的需求,研究了OCR 的方式和读PDF的方式,实际是可行的ÿ…...
FTXUI::Dom 模块
DOM 模块定义了分层的 FTXUI::Element 树,可用于构建复杂的终端界面,支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...
RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上
一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema,不需要复杂的查询,只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 :在几秒钟…...
