【JavaSE】深度理解JVM

发布时间:2026/11/5 19:11:20

【JavaSE】深度理解JVM 1. 什么是 JVMJVMJava Virtual MachineJava虚拟机是Java平台的核心组成部分它是一个虚拟的计算机负责执行编译后的Java字节码.class文件。简单来说JVM就是Java程序运行的“发动机”和“操作系统”。核心作用平台无关性Java的口号是“一次编写到处运行”Write Once, Run Anywhere。这背后的功臣就是JVM。开发者编写的Java源代码.java文件被编译成与平台无关的字节码然后由不同操作系统Windows、Linux、macOS上的JVM来解释执行。JVM充当了字节码和底层硬件/操作系统之间的翻译官。内存管理JVM自动管理程序运行所需的内存包括分配和回收垃圾回收让开发者从复杂且易错的手动内存管理中解放出来。安全沙箱JVM提供了一个受控的运行环境沙箱可以限制Java程序的权限例如文件访问、网络操作等增强了安全性。可以把JVM想象成一个万能游戏机你买的游戏卡带字节码可以在任天堂、索尼等不同品牌的游戏机不同操作系统的JVM上运行而游戏机负责读取卡带、渲染画面、处理操作。2. JVM 的核心架构三驾马车JVM的运行时数据区可以简化为三个核心部分这是理解其工作原理的关键。Java 虚拟机 (JVM)EJava源代码 (.java)编译器 (javac)字节码文件 (.class)类加载子系统(Class Loader Subsystem)方法区 (Method Area)堆 (Heap)Java虚拟机栈 (Java Stack)程序计数器 (PC Register)本地方法栈 (Native Method Stack)执行引擎(Execution Engine)解释器 (Interpreter)即时编译器 (JIT Compiler)垃圾回收器 (GC)本地方法接口 (JNI)本地方法库 (Native Libraries)操作系统/硬件2.1 类加载子系统 (Class Loader Subsystem)它是JVM的“搬运工”和“安检员”。职责负责查找、加载、链接和初始化.class文件。过程加载通过类的全限定名如java.lang.String获取二进制字节流并在内存中生成一个代表该类的java.lang.Class对象。验证检查字节码是否符合JVM规范确保不会危害虚拟机安全。准备为类的静态变量分配内存并设置默认初始值如int为0引用为null。解析将常量池中的符号引用如类名、方法名转换为直接引用内存地址。初始化执行类的静态代码块static{}和为静态变量赋真正的初始值。2.2 运行时数据区 (Runtime Data Areas)这是JVM的“工作车间”程序运行时的数据都存放在这里。主要分为线程共享和线程私有区域。线程共享区域所有线程共享同一份堆 (Heap)这是JVM中最大的一块内存区域是垃圾回收GC的主要战场。几乎所有通过new关键字创建的对象实例和数组都存放在这里。特点生命周期由垃圾回收器管理大小可通过-Xmx和-Xms参数调节。方法区 (Method Area)存储已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。在HotSpot虚拟机中方法区的实现常被称为“永久代”JDK 8之前或“元空间”MetaspaceJDK 8及之后。线程私有区域每个线程独享一份Java虚拟机栈 (Java Stack)描述Java方法执行的内存模型。每个方法在执行时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。方法调用对应栈帧入栈执行完毕对应出栈。我们常说的“栈内存”就是指这里。局部变量表存放基本数据类型int,double,boolean等和对象引用reference。程序计数器 (Program Counter Register)一块很小的内存空间可以看作是当前线程所执行的字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等都依赖于它。本地方法栈 (Native Method Stack)为JVM调用本地Native方法服务其作用类似于Java虚拟机栈。2.3 执行引擎 (Execution Engine)它是JVM的“CPU”负责执行字节码。解释器逐行读取、解释并执行字节码。启动快但执行慢。即时编译器 (JIT Compiler)JVM运行时的性能优化关键。它会将频繁执行的字节码热点代码编译成本地机器码并缓存起来下次直接执行机器码极大提升运行效率。HotSpot VM的名字正源于其强大的热点代码探测能力。垃圾回收器 (Garbage Collector)自动回收堆中不再被引用的对象所占用的内存是Java内存自动管理的核心。3. 一个简单的程序执行流程让我们通过一段最简单的代码串联起JVM的工作流程publicclassHelloJVM{publicstaticvoidmain(String[]args){StringmessageHello, JVM!;System.out.println(message);}}编写与编译你写下HelloJVM.java用javac命令编译得到HelloJVM.class字节码文件。启动JVM在命令行输入java HelloJVM。操作系统会启动一个JVM进程。类加载JVM的类加载子系统开始工作加载HelloJVM.class文件。找到main方法。分配内存JVM为main方法在Java虚拟机栈中创建一个栈帧。执行字节码执行引擎解释器开始逐行执行main方法中的字节码。String message Hello, JVM!;字符串字面量Hello, JVM!可能被放入运行时常量池在方法区栈帧的局部变量表中创建引用message指向它。System.out.println(message);执行引擎找到System类的out静态字段和println方法进行调用。本地方法调用println方法内部最终会通过本地方法接口JNI调用操作系统的底层函数在控制台打印出文字。方法结束main方法执行完毕其栈帧从虚拟机栈中弹出。程序结束JVM进程关闭。4. 关键概念垃圾回收 (GC) 简析垃圾回收是JVM自动内存管理的核心主要针对堆内存。如何判断对象是“垃圾”引用计数法Java未采用对象被引用一次计数加1引用失效减1。为0时可回收。但无法解决循环引用问题A引用BB引用A但外界都不再引用它们。可达性分析算法Java采用以一系列称为“GC Roots”的对象如虚拟机栈中引用的对象、静态属性引用的对象等作为起点向下搜索走过的路径称为“引用链”。如果一个对象到GC Roots没有任何引用链相连则证明此对象不可用是可回收的。垃圾回收算法了解即可标记-清除先标记所有需要回收的对象然后统一回收。简单但会产生内存碎片。复制将内存分为两块每次只用一块。垃圾回收时将存活对象复制到另一块然后清空当前块。高效无碎片但浪费一半空间。标记-整理标记过程同“标记-清除”但后续让所有存活对象向一端移动然后直接清理掉边界以外的内存。适合老年代。分代收集现代JVM采用的综合策略。将堆分为新生代和老年代。新生代存放新创建的对象。特点是“朝生夕死”回收频繁。一般采用复制算法。老年代存放经历多次GC依然存活的对象。特点是不易“死亡”。一般采用标记-清除或标记-整理算法。5. 总结与常见面试题核心总结JVM是什么让Java实现跨平台、自动内存管理的虚拟机。核心架构类加载搬砖安检、运行时数据区车间堆、栈、方法区等、执行引擎干活解释、编译、GC。跨平台原理.java- (编译) -.class字节码 - (不同平台的JVM解释/编译执行) - 运行。内存管理核心堆是对象仓库GC自动清理栈是方法调用现场。快速自测JVM、JRE、JDK 的关系是什么JDK (Java Development Kit)Java开发工具包包含JRE和编译工具javac等。JRE (Java Runtime Environment)Java运行时环境包含JVM和核心类库。只能运行Java程序。JVMJava虚拟机是JRE的一部分负责执行字节码。关系JDK JRE JVM。Java是“编译型”还是“解释型”语言两者都是。Java先编译成字节码编译型然后由JVM解释或即时编译执行解释型/JIT编译型。因此常被称为“半编译、半解释”语言。栈溢出 (StackOverflowError) 和内存溢出 (OutOfMemoryError) 有什么区别StackOverflowError通常由无限递归引起Java虚拟机栈空间不足每个线程的栈大小是有限的。OutOfMemoryError通常指堆内存不足无法分配新对象。也可能发生在方法区元空间、本地方法栈等。理解JVM是深入Java世界的基石。它不仅是面试高频考点更能帮助你在实际开发中写出更高效、稳健的代码并有效进行性能调优和故障排查。
延伸阅读

更多相关文章

2026/11/4 23:20:54

双节锂电池保护IC新手设计指南,从选芯片到画板子一篇全讲透

双节锂电池保护IC完整设计指南 参考设计过流计算电压检测充电搭配,电路图BOM全公开 做双节锂电池(7.4V/8.4V)产品,保护IC是必不可少的。很多人在设计时会遇到这些问题:我的电池组只有两根线,还需要保护IC吗…

2026/11/2 23:40:35

PDF字体缺失终极解决方案:PDF补丁丁字体嵌入功能完全指南

PDF字体缺失终极解决方案:PDF补丁丁字体嵌入功能完全指南 【免费下载链接】PDFPatcher PDF补丁丁——PDF工具箱,可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档,探查文档结构,提取图片、转成图片等等 项目地址: https:/…

2026/10/25 12:58:05

终极指南:如何使用docs.gl重构OpenGL文档体验

终极指南:如何使用docs.gl重构OpenGL文档体验 【免费下载链接】docs.gl OpenGL Reference Documentation 项目地址: https://gitcode.com/gh_mirrors/do/docs.gl docs.gl是一个革命性的OpenGL文档重构项目,专门为图形开发者和游戏程序员设计。这个…

2026/11/5 16:51:33

EasyU优启通PE维护盘实战指南:制作、启动与核心操作全解析

1. 为什么一个PE维护盘值得单独拿出来聊装系统、修引导、救数据、清病毒,这些活儿但凡干过几次的人都知道,真正决定效率的往往不是你手速多快,而是手边那套PE环境靠不靠谱。EasyU(圈内习惯叫优启通)就是在这个场景下被…

2026/11/5 16:26:13

Rust原来很简单二:所有权系统

Part 2 核心篇 —— 所有权系统 本篇覆盖 第 6 ~ 10 章:所有权、借用与引用、生命周期、字符串与切片、内存模型。 ⚠️ 这是全书最重要的一篇。 把它吃透,Rust 从此“很简单”;跳过它,你会处处碰壁。请慢下来,动手敲每一段代码。 第 6 章 所有权:Rust 的第一性原理 6…

2026/11/5 15:00:49

基于Hadoop+Spark的民宿智能推荐系统设计与实现

1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享…

2026/11/5 14:10:30

ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配RS485,解决远距离温度监控难题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑