Java虚拟机 - JVM与Java体系结构
Java虚拟机
- JVM与Java体系结构
- 为什么要学习JVM
- Java与JVM简介
- Java 语言的核心特性
- JVM:Java 生态的基石
- JVM的架构模型
- 基于栈的指令集架构(Stack-Based)
- 基于寄存器的指令集架构(Register-Based)
- JVM生命周期
- 总结
JVM与Java体系结构
Java不仅仅是一个简单的编程语言,它是由一系列的软件与规范组成的技术体系。而JVM是Java程序的运行核心,通过字节码解释执行实现"一次编写,到处运行"特性,而Java体系结构由编程语言规范、类库体系及JVM运行时环境共同构成,支撑跨平台面向对象开发。可以说JVM是整个Java平台的基石,是将Java技术隔绝操作系统与硬件的关键部分。
为什么要学习JVM
功利点说,现在找工作的门槛越来越高,JVM知识点经常出现在面试题目中,要想通过面试,我们也需要了解JVM。但是除去面试,程序开发中我们也会遇见:
- 定位 OOM(内存溢出):通过分析堆转储(Heap Dump)和 GC 日志,快速定位内存泄漏的根源。
- 线程死锁:利用 JVM 工具(如 jstack)分析线程状态,解决多线程并发问题。
- 性能瓶颈:通过 Profiling 工具(如 VisualVM、Arthas)监控 CPU、内存使用情况,找到性能热点。
这些都需要我们具备JVM的基础知识,才能在生产中遇到类似问题迎刃而解。掌握了基础知识,我们可以更好地做到下面几点:
- 内存管理:理解 JVM 的内存结构(堆、栈、方法区等)能帮助你优化内存分配,避免内存泄漏和频繁的垃圾回收(GC)。
- 垃圾回收机制:不同场景需要不同的 GC 算法(如 G1、ZGC、Shenandoah),学习 JVM 可以合理选择并配置 GC,减少程序停顿时间。
- 代码优化:通过 JIT 编译器、逃逸分析等机制,理解 JVM 如何优化代码执行,从而编写更高效的代码
Java与JVM简介
Java 自 1995 年由 Sun Microsystems 发布以来,凭借其 跨平台能力、面向对象特性 和 丰富的生态系统,迅速成为全球最流行的编程语言之一。而 Java 虚拟机(JVM)作为 Java 技术的核心引擎,通过“一次编写,到处运行”(Write Once, Run Anywhere)的理念,彻底改变了软件开发的模式。
下面这张图是Java技术体系,从这张图我们可以了解Java与Jvm的关系。应该从这张图,我们可以形象地认识到JVM是Java语言的核心基石,所以我们要想学习好Java语言,一定要了解JVM。
Java 语言的核心特性
- 跨平台能力
Java 的跨平台性依赖于 JVM 的中间层设计。开发者编写的 .java 文件会被编译为与平台无关的 字节码(.class 文件),由 JVM 在目标平台上解释或编译执行。
示例:同一份 Java 程序可在 Windows、Linux、macOS 上运行,无需修改源码。
意义:降低多环境适配成本,推动企业级应用的快速部署。
-
面向对象设计(OOP)
Java 是纯粹的面向对象语言,其核心思想通过 封装、继承、多态 实现:-
封装:通过 private、protected 关键字隐藏实现细节,暴露安全接口。
-
继承:extends 实现代码复用,implements 支持多接口扩展。
-
多态:同一方法在不同子类中呈现不同行为(如 Animal 类的 sound() 方法被 Dog 和 Cat 重写)。
-
-
健壮性与安全性
-
异常处理:强制检查异常(Checked Exceptions)要求开发者显式处理潜在错误(如 IOException)。
-
内存管理:JVM 自动垃圾回收机制(GC)减少内存泄漏风险。
-
安全沙箱:通过字节码验证和安全管理器(SecurityManager)限制恶意代码访问系统资源。
-
-
现代语言特性演进
Java 持续吸收现代编程范式的优点:-
Java 8:引入 Lambda 表达式、Stream API,支持函数式编程。
-
Java 11:var 关键字简化局部变量声明,HTTP Client 支持异步请求。
-
Java 17:密封类(sealed class)限制继承关系,模式匹配增强代码可读性。
-
JVM:Java 生态的基石
- JVM 的核心作用
JVM 是 Java 程序运行的虚拟化环境,主要职责包括:
-
字节码解释与执行:将 .class 文件转换为机器指令。
-
内存管理:分配堆、栈、方法区等内存空间,并自动回收垃圾对象。
-
线程调度:管理多线程的创建、同步与资源竞争。
- JVM 的运行时数据区
JVM 内存划分为多个核心区域:
-
堆(Heap):存储对象实例,是垃圾回收的主战场。
-
方法区(Metaspace):存放类元数据(Java 8 后替代永久代)。
-
虚拟机栈:存储方法调用的栈帧(局部变量、操作数栈)。
-
程序计数器:记录当前线程执行的字节码位置。
-
本地方法栈:支持 Native 方法(如 C/C++ 库调用)。
- 类加载机制
JVM 通过 双亲委派模型 加载类:
-
加载:从文件、网络等来源读取 .class 文件。
-
验证:确保字节码符合 JVM 规范,防止恶意代码注入。
-
准备:为静态变量分配内存并初始化默认值。
-
解析:将符号引用转换为直接引用。
-
初始化:执行静态代码块(static{})和赋值操作。
示例:自定义类加载器可实现热部署(如 Tomcat 为每个 Web 应用单独加载类)。
- 垃圾回收(GC)机制
JVM 通过 GC 自动回收无用的对象,关键算法包括:
-
标记-清除:简单但易产生内存碎片。
-
复制算法:将存活对象复制到新空间(适用于年轻代)。
-
标记-整理:整理内存碎片(适用于老年代)。
分代收集:根据对象生命周期划分年轻代(Young Generation)和老年代(Old Generation)。
现代 GC 器:G1(低延迟)、ZGC(TB 级堆内存)、Shenandoah(并发回收)。
调优场景:高并发服务可通过 -XX:+UseG1GC 启用 G1 垃圾回收器,减少停顿时间。
- JIT 编译器
JVM 通过 即时编译(Just-In-Time Compilation) 提升性能:
-
解释执行:初期逐行解释字节码,启动速度快。
-
热点代码优化:频繁执行的代码(热点代码)被编译为本地机器码。
-
逃逸分析:优化对象分配(如栈上分配、锁消除)。
JVM的架构模型
Java编译器输入的指令流是一种基于栈的指令集架构,另外一种常见的指令集架构则是基于寄存器的指令集架构。计算机指令集架构(ISA)是硬件与软件交互的核心接口,决定了程序如何被编译和执行。基于栈的指令集架构(如 JVM 字节码)和 基于寄存器的指令集架构(如 x86、ARM)是两种经典的设计范式,它们在指令执行方式、性能特点和应用场景上存在显著差异。
基于栈的指令集架构(Stack-Based)
-
核心原理
数据操作依赖栈结构:所有计算通过操作数栈(Operand Stack)完成。指令从栈顶取操作数:例如,加法指令 iadd 会弹出栈顶两个整数,相加后结果压回栈顶。无需显式指定操作数地址:指令本身不包含寄存器或内存地址,隐含依赖栈顶数据。 -
典型示例(JVM 字节码)
java// Java 代码:计算 3 + 5int a = 3;int b = 5;int c = a + b;对应的字节码:
字节码
iconst_3 // 将常量3压入栈顶istore_1 // 弹出栈顶值(3),存入局部变量表第1槽位(a)iconst_5 // 将常量5压入栈顶istore_2 // 弹出栈顶值(5),存入局部变量表第2槽位(b)iload_1 // 加载局部变量a的值(3)到栈顶iload_2 // 加载局部变量b的值(5)到栈顶iadd // 弹出栈顶两个值(3和5),相加后结果(8)压入栈顶istore_3 // 弹出栈顶值(8),存入局部变量表第3槽位(c)
- 优点
-
指令紧凑:无需指定操作数地址,指令长度短(如 JVM 字节码通常为 1-2 字节)。
-
跨平台友好:不依赖物理寄存器数量或布局,适合虚拟机实现(如 JVM)。
-
代码生成简单:编译器无需处理寄存器分配,逻辑更简单。
- 缺点
-
执行速度较慢:频繁的入栈、出栈操作导致内存访问开销大。
-
指令数量多:简单操作可能需要多条指令(如加载变量到栈顶再计算)。
基于寄存器的指令集架构(Register-Based)
- 核心原理
数据操作依赖寄存器:指令直接读写寄存器中的操作数。
显式指定操作数地址:指令需声明操作数所在的寄存器或内存地址。
结果直接写入寄存器:例如,加法指令 ADD R1, R2, R3 表示 R1 = R2 + R3。
2. 典型示例(ARM 汇编)
// 计算 3 + 5,结果存入寄存器 R0
MOV R1, #3 // 将立即数3存入寄存器R1
MOV R2, #5 // 将立即数5存入寄存器R2
ADD R0, R1, R2 // R0 = R1 + R2
- 优点
执行效率高:减少内存访问次数,数据直接在寄存器中操作。
指令数量少:单条指令可完成复杂操作(如 ADD 直接操作三个寄存器)。
硬件优化潜力大:与现代 CPU 的多级流水线、乱序执行等特性契合。
- 缺点
指令长度较长:需编码寄存器地址,指令占用空间更大。
依赖硬件寄存器数量:寄存器数量有限的架构(如 x86)可能需频繁内存交互。
编译器复杂度高:需优化寄存器分配策略(如避免寄存器溢出)。
JVM生命周期
JVM的生命周期分为三个状态:启动、执行和推出
- 启动: JVM可以通过java命令启动,接着通过引导类加载器加载类文件,最后找到程序中的main方法,接着开始执行Java应用程序
- 执行: JVM的执行,表示一个已经启动的JVM开始执行Java程序,执行一个Java程序,真正执行的是一个JVM的进程。
- 退出: JVM的退出有下面几种情况
- Java程序正常结束,所有的非守护线程结束
- Java程序异常
- 操作系统故障
- 用户手动关闭JVM
- 调用Runtime或者System的exit方法
总结
我们本章简单介绍一下Java语言与JVM的结构,之后我们会在专栏文章中,逐步把我们上面介绍的知识点都覆盖到,争取能够做到让大家能够对JVM的知识有一个宏观的认识。
相关文章:

Java虚拟机 - JVM与Java体系结构
Java虚拟机 JVM与Java体系结构为什么要学习JVMJava与JVM简介Java 语言的核心特性JVM:Java 生态的基石JVM的架构模型基于栈的指令集架构(Stack-Based)基于寄存器的指令集架构(Register-Based)JVM生命周期 总结 JVM与Jav…...
elementUI调整滚动条高度后与固定列冲突问题解决
/* 1. 首先确保基础样式生效 */ .el-table.el-table–scrollable-x .el-table__body-wrapper { overflow-x: auto !important; } /* 2. 设置滚动条高度(对所有表格生效) */ .el-table__body-wrapper::-webkit-scrollbar { height: 10px !important; } …...
基于 nvitop+Prometheus+Grafana 的物理资源与 VLLM 引擎服务监控方案
一、方案背景与目标 在人工智能与高性能计算场景中,对物理资源(尤其是 GPU)的实时监控以及对 VLLM 引擎服务的性能追踪至关重要。本方案通过整合 nvitop、Prometheus 和 Grafana 三大组件,构建一套完整的监控体系,实现…...
互联网大厂Java求职面试:Spring AI与大模型交互在短视频平台中的应用
互联网大厂Java求职面试:Spring AI与大模型交互在短视频平台中的应用 面试场景设定 郑薪苦,一名有着丰富项目经验但总是能用奇葩比喻解释复杂技术的程序员,正在接受某知名互联网大厂技术总监的面试。 第一轮提问 面试官:假设我…...
【Lua】java 调用redis执行 lua脚本
【Lua】java 调用redis执行 lua脚本 public Object executeLuaScript(String script, List<String> keys, Object... args) {// 注意: 这里 Long.class 是返回值类型, 一定要指定清楚 不然会报错return this.redisTemplate.execute(RedisScript.of(j脚本, Long.class), k…...
【工奥阀门科技有限公司】签约智橙PLM
近日,工奥阀门科技有限公司正式签约了智橙泵阀行业版PLM。 忠于质量,臻于服务,精于研发 工奥阀门科技有限公司(以下简称工奥阀门)坐落于浙江永嘉,是一家集设计、开发、生产、销售、安装、服务为一体的阀门…...

灌区量测水自动化监测解决方案
一、方案背景 随着社会发展和人口增长,水资源需求不断增大。我国水资源总量虽然丰富,但时空分布不均,加之农业用水占比大且效率偏低,使得水资源短缺问题日益凸显。农业用水一直是我国的耗水大户,占全部耗水总量的60%以…...
SpringBoot整合MQTT实战:基于EMQX构建高可靠物联网通信,从零到一实现设备云端双向对话
一、引言 随着物联网(IoT)技术的快速发展,MQTT(Message Queuing Telemetry Transport)协议因其轻量级、低功耗和高效的特点,已成为物联网设备通信的事实标准。本文将详细介绍如何使用SpringBoot框架整合MQTT协议,基于开源MQTT代理EMQX实现设…...
AI与机器学习深度集成:从设备端能力爆发到开发工具智能化
简介 AI与机器学习技术正以惊人的速度在移动开发领域深入集成,设备端AI能力爆发与AI辅助开发工具的崛起,为开发者带来了前所未有的高效开发体验和应用创新机遇。本文将全面解析Google最新AI技术栈(包括ML Kit 2.0和Gemini Nano模型)的特性与应用场景,探索Android Studio …...

界面控件DevExpress WinForms v24.2 - 数据处理功能增强
DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…...

Linux的MySQL头文件和找不到头文件问题解决
头文件 #include <iostream> #include <mysql_driver.h> #include <mysql_connection.h> #include <cppconn/statement.h> #include <cppconn/resultset.h> #include <cppconn/prepared_statement.h> #include <cppconn/exception.h&g…...

wps excel将表格输出pdf时所有列在一张纸上
记录:wps excel将表格输出pdf时所有列在一张纸上 1,调整缩放比例,或选择将所有列打印在一页 2,将表格的所有铺满到这套虚线...

zabbix7.2最新版本 nginx自定义监控(三) 设置触发器
安装zabbix-get服务 在zabbix-server端口安装zabbix-get服务 [rootlocalhost ~]# dnf install -y zabbix-get Last metadata expiration check: 1:55:49 ago on Wed 14 May 2025 09:24:49 AM CST. Dependencies resolved. Package Architectur…...
CDN加速对云手机延迟的影响
一、CDN加速对云手机延迟的核心作用 缩短物理距离,降低网络延迟 CDN通过全球分布的节点,将云手机的服务内容(如应用数据、画面流)缓存至离用户最近的服务器,减少数据传输的物理距离。例如,用户在中国访问美…...
为什么 Docker 建议关闭 Swap
在使用 Docker 时,关闭系统 Swap(交换分区) 是一个常见的推荐做法,尤其是在生产环境中。虽然 Docker 不强制要求禁用 Swap,但出于性能、稳定性、可控性和资源管理的目的,通常建议这样做。 为什么 Docker 建…...

缓存的相关内容
缓存是一种介于数据永久存储介质与数据应用之间数据临时的存储介质 实用化保存可以有效地减少低俗数据读取的次数 (例如磁盘IO), 提高系统性能 缓存不仅可以用于提高永久性存储介质的数据读取效率,还可以提供临时的数据存储空间 spring boot中提供了缓存技术, 方便…...

[ctfshow web入门] web77
信息收集 上一题的读取flag方式不能用了,使用后的回显是:could not find driver 解题 同样的查目录方法 cvar_export(scandir("glob:///*"));die();cforeach(new DirectoryIterator("glob:///*") as $a){echo($a->__toString…...

C++学习-入门到精通-【7】类的深入剖析
C学习-入门到精通-【7】类的深入剖析 类的深入剖析 C学习-入门到精通-【7】类的深入剖析一、Time类的实例研究二、组成和继承三、类的作用域和类成员的访问类作用域和块作用域圆点成员选择运算符(.)和箭头成员选择运算符(->)访问函数和工具函数 四、具有默认实参的构造函数重…...
API 加速方案:如何使用 Redis 与 Memcached 进行高效缓存优化
API 加速方案:如何使用 Redis 与 Memcached 进行高效缓存优化 1. 引言 在现代 Web 开发中,API 响应速度至关重要。用户期望实时访问数据,而后端服务可能受到数据库查询、计算开销或网络传输的限制。这时候,缓存技术可以有效减少 API 延迟,提升系统性能。 本篇文章将深入…...

主成分分析的应用之sklearn.decomposition模块的PCA函数
主成分分析的应用之sklearn.decomposition模块的PCA函数 一、模型建立整体步骤 二、数据 2297.86 589.62 474.74 164.19 290.91 626.21 295.20 199.03 2262.19 571.69 461.25 185.90 337.83 604.78 354.66 198.96 2303.29 589.99 516.21 236.55 403.92 730.05 438.41 225.80 …...

1. Go 语言环境安装
👑 博主简介:高级开发工程师 👣 出没地点:北京 💊 人生目标:自由 ——————————————————————————————————————————— 版权声明:本文为原创文章…...

IP协议深度解析:互联网世界的核心基石
作为互联网通信的基础协议,IP(Internet Protocol)承载着全球99%的网络数据流量。本文将深入剖析IP协议的核心特性、工作原理及演进历程,通过技术原理、协议对比和实战案例分析,为您揭示这个数字世界"隐形交通规则…...

Oracle DBMS_STATS.GATHER_DATABASE_STATS 默认行为
Oracle DBMS_STATS.GATHER_DATABASE_STATS 默认行为 DBMS_STATS.GATHER_DATABASE_STATS的默认选项究竟是’GATHER’还是’GATHER AUTO’?这个问题非常重要,因为理解默认行为直接影响统计信息收集策略。 一 官方文档确认 根据Oracle 19c官方文档&#…...

C++天空之城的树 全国信息素养大赛复赛决赛 C++小学/初中组 算法创意实践挑战赛 内部集训模拟题详细解析
C++天空之城的树 全国青少年信息素养大赛 C++复赛/决赛模拟练习题 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】1、C++专栏 电子学会C++一级历年真题解析...
HTTP 请求走私(HTTP Request Smuggling)
HTTP 请求走私(HTTP Request Smuggling)是一种通过利用前端代理(如负载均衡器、CDN)和后端服务器在 解析 HTTP 请求时存在不一致性 的漏洞,从而实现 注入恶意请求 的攻击技术。 一、基本原理 HTTP 请求走私主要依赖两…...
基于WebRTC的实时语音对话系统:从语音识别到AI回复
基于WebRTC的实时语音对话系统:从语音识别到AI回复 在当今数字化时代,实时语音交互已成为人机界面的重要组成部分。本文将深入探讨一个基于WebRTC技术的实时语音对话系统,该系统集成了语音识别(ASR)、大语言模型(LLM)和语音合成(TTS)技术&am…...
typeof运算符和深拷贝
typeof运算符 识别所有值类型识别函数判断是否是引用类型(不可再细分) //判断所有值类型 let a; typeof a //undefined const strabc; typeof str //string const n100; typeof n //number const …...
.Net HttpClient 使用 Cookie
在 HttpClient 中使用 Cookie Cookie 是服务器存储在客户端的小型数据片段,可用于身份验证、会话跟踪等。 .Net HttpClient 支持 Cookie 功能,本教程详细介绍了Cookie 的管理与使用。 初始化 #!import "./Ini.ipynb"什么是 Cookie Cookie …...
Python爬虫实战:通过PyExecJS库实现逆向解密
1. 核心定义 1.1 PyExecJS 库 PyExecJS 是 Python 的第三方库,通过调用 JavaScript 运行时环境(如 Node.js、PhantomJS),实现 Python 与 JavaScript 的无缝交互。其核心功能包括: JavaScript 代码编译与执行跨语言函数调用与数据传递多引擎支持与自动环境检测1.2 字段加…...
Java中的伪共享(False Sharing):隐藏的性能杀手与高并发优化实战
引言 在高性能Java应用中,开发者通常会关注锁竞争、GC频率等显性问题,但一个更隐蔽的陷阱——伪共享(False Sharing)——却可能让精心设计的并发代码性能骤降50%以上。伪共享是由CPU缓存架构引发的底层问题,常见于多…...