资讯动态

深入解析 JVM(Java Virtual Machine):从字节码加载到内存管理与垃圾回收的完整运行机制

发布时间:2026/10/3 2:29:51 来源:尧图企业网站定制
教程知识库【免费下载链接】tech-interview-for-developer 신입 개발자 전공 지식 기술 면접 백과사전 项目地址https://gitcode.com/GitHub_Trending/te/tech-interview-for-developer点击查看免费下载本文基于 tech-interview-for-developer 仓库中的 Language/[java] 자바 가상 머신(Java Virtual Machine).md 整理扩充并融合仓库内 Java 编译过程、Java 版本特性变化、Interned String 与 Java 中的 Thread 等姊妹文档形成一套面向面试复习与工程实践的 JVM 体系化解读。读完本文你将掌握JVM 为什么能让 Java一次编写、到处运行、一个.class文件从类加载到执行引擎的完整生命周期、五大运行时数据区域的职责与共享关系以及垃圾回收GC的基本原理。一、JVM 是什么一个程序执行程序的规范与运行时1.1 定义与定位JVMJava Virtual Machine자바 가상 머신是一个管理系统内存、并为基于 Java 的应用程序提供可移植执行环境的虚拟机。官方层面的准确说法是JVM 是用于执行代码并为该代码提供运行时环境Runtime Environment的程序规范Specification。也就是说JVM 首先是一份规范规定了字节码该如何被加载、验证、执行以及内存该如何划分而我们在实际运行 Java 程序时见到的java进程则是这份规范的一种具体实现如 HotSpot VM。开发者口中常说的JVM通常特指运行在某个设备上的进程Process尤其是代表并控制着 Java 应用资源的那个服务进程。该进程通过类加载器Class Loader读取 Java 应用程序的类文件并与 Java API 一起执行。它在 Java 程序与操作系统OS之间扮演中间人中介角色从而让 Java 应用摆脱对特定 OS 的依赖实现跨平台复用。1.2 两大核心功能JVM 具备的功能可以概括为两点跨平台执行让 Java 程序能在任何设备、任何操作系统上运行这正是Write Once, Run Anywhere的技术根基内存管理与优化负责程序内存的管理与优化包括运行时内存区域的划分、垃圾回收等。1.3 补充为什么 JVM 能实现 OS 无关Java 之所以具备 OS 无关的特性关键在于 Java 源码并不是直接编译成机器码而是先编译成 JVM 能理解的字节码Bytecode。字节码与具体硬件/OS 无关真正与 OS 打交道的是 JVM 本身。因此同一份.class文件只需在不同平台上安装对应的 JVM 实现即可原样运行——这就是 Java 编译过程 中反复强调的OS 独立性的由来。二、JVM 中的内存管理整体执行流程JVM 执行中最常见的交互操作就是检查堆Heap与栈Stack的内存使用情况。理解内存管理首先要理解一条 Java 程序的完整执行链路。2.1 五步执行过程向 OS 申请内存程序启动后JVM 从操作系统那里申请该程序所需的内存并按用途将这些内存划分为多个区域进行管理即下面的 Runtime Data Areas源码编译为字节码Java 编译器JAVAC / Java Compiler读取 Java 源码.java将其转换为 Java 字节码.class文件类加载通过类加载器Class Loader将转换好的.class文件加载到 JVM 内存区域中字节码解释执行加载后的.class文件由执行引擎Execution Engine进行解释Interpreter与编译JIT Compiler内存区域中实际执行被解释/编译的字节码被放置在内存区域中完成真正的运算在此过程中JVM 按需执行**线程同步Thread Synchronization与垃圾回收Garbage Collection**等内存管理任务。.java 源码 │ javac 编译 ▼ .class 字节码 │ 类加载器Class Loader动态加载 链接 ▼ 运行时数据区域Runtime Data Areas │ 执行引擎Execution Engine解释 / JIT 编译 ▼ 真正执行 GC / 线程同步2.2 两个关键角色Java 编译器JAVAC负责把 Java 源码.java转换为字节码.class。字节码的每条指令由1 字节大小的 Opcode操作码与**附加的操作数Operand**组成此时它既不是人能读的源码也不是 CPU 能直接执行的机器码而是JVM 能理解的代码。类加载器Class LoaderJVM 在运行时第一次引用某个类时才去加载该类并放置到内存区域中这种**动态加载Dynamic Loading**机制正是由类加载器完成的。关于它内部更细的加载、验证、准备、解析、初始化五阶段见下文第三章。三、类加载器动态加载与链接的五阶段Java 编译过程 将类加载器的详细动作拆解为五个阶段这也是 JVM 面试的高频考点加载Load读取类文件并将其加载到 JVM 内存中验证Verify检查该类是否按照Java 语言规范Java Language Specification与JVM 规范所规定的内容正确构成防止不合法或恶意的字节码破坏运行时准备Prepare为类所需的内存进行分配字段、方法、接口等并为静态字段赋予 JVM 默认的零值解析Resolve将类常量池Constant Pool中的符号引用Symbolic Reference替换为直接引用Direct Reference初始化Initialize将类变量static 字段初始化为合适的值执行clinit即静态初始化块与静态字段的赋值。与类加载器强相关的另一个内存细节是常量池字符串字面量String Literal之所以能用比较出相同引用正是因为 JVM 通过常量池统一管理字符串对象——详见仓库内 Interned String in Java其中解释了new String(HARIBO)与字面量HARIBO引用不等、String.valueOf()返回this的原因。四、运行时数据区域Runtime Data Areas五大内存分区运行时数据区域是JVM 运行在操作系统之上时从 OS 分配到的内存区域共划分为 5 个部分区域线程共享主要职责PC 寄存器Program Counter Register线程私有记录当前线程正在执行的 JVM 指令地址JVM 栈JVM Stack / 栈 Area线程私有存储局部变量、方法参数、方法信息、临时数据等本地方法栈Native Method Stack线程私有执行由真实机器码Native Code编写的程序堆Heap所有线程共享存储运行时动态分配的数据对象、数组方法区Method Area所有线程共享存储 JVM 读取的每个类/接口的运行时常量池、字段与方法代码、静态变量、方法字节码下面逐一展开。4.1 PC 寄存器线程私有记录该线程接下来应该执行哪一条指令的部分保存的是 JVM 指令的地址。每个线程都有自己独立的 PC 寄存器这是实现线程上下文切换后能恢复执行位置的基础。4.2 JVM 栈线程私有保存局部变量、方法参数、方法信息、临时数据等。每一个方法调用都会对应一个栈帧Stack Frame方法执行完即弹出。它与操作系统线程栈的概念一一对应——仓库内的 Java 中的 Thread 曾指出调用start()时 JVM 会为线程新建独立的调用栈Call Stack而直接调用run()只是复用了main线程的调用栈并不是真正的多线程执行这正是面试中常问的为什么要用start()而不是run()的答案。4.3 本地方法栈线程私有用于执行以真实可执行的机器码Native Code编写的程序的区域比如调用 C/C 编写的 JNIJava Native Interface方法时使用。4.4 堆Heap所有线程共享存储运行时动态分配的数据对象和数组的创建就在这里完成。堆中分配的数据同时也是垃圾回收器Garbage Collector回收的对象因此堆是JVM 性能问题中被提及最多的空间如 OOM、GC 停顿大多与堆相关。仓库的 数据结构 Heap 与code/目录下的 MaxHeap.java、MinHeap.java 讨论的是堆数据结构而 JVM 中的堆内存是一种内存区域划分两者概念不同面试时注意区分。4.5 方法区Method Area所有线程共享JVM 启动时创建保存JVM 读取到的每个类与接口的运行时常量池Runtime Constant Pool、字段与方法代码、静态变量、方法的字节码等元信息。在 Java 8 之前方法区的经典实现是永久代Permanent Generation, PermGenJava 8 起将其移除改为使用Metaspace——由 OS 自动调节的原生内存Native Memory区域不再由 JVM 固定大小决定详见 Java major feature changes 中记录的 Java 8 变更项。五、执行引擎Execution Engine解释器与 JIT 编译器字节码被加载进内存后由执行引擎按指令为单位逐一取出并执行。执行引擎采用两种方式解释器Interpreter一条一条地读取字节码指令并解释执行。单条指令执行快但整体执行速度较慢——因为每条指令都要重复解释JIT 编译器Just-In-Time Compiler为弥补解释器的缺点而引入。它将整个字节码或热点方法一次性编译为二进制机器码之后不再对该方法进行解释而是直接执行编译好的二进制码。由于省去了逐条解释的开销整体执行速度明显快于纯解释方式。这也是 JVM 能达到接近原生编译语言性能的关键手段。补充记忆点现代 HotSpot JVM 通常采用先解释执行收集热点再对热点代码做 JIT 编译的混合模式配合逃逸分析、内联缓存等优化进一步提升执行效率。该部分内容同样源自 Java 编译过程。六、垃圾回收Garbage Collection, GCJVM 自动化的内存管理6.1 背景从手动管理到自动管理在 Java 之前程序员必须手动管理全部程序内存如 C 语言中的malloc/free。而在 Java 中由 JVM 统一管理程序内存这一职责就是通过垃圾回收GC完成的GC 持续找出 Java 程序中不再被使用不再被引用的内存并加以清除。6.2 执行顺序① 扫描并删除不再被引用的对象 ↓ ② 归还被删除对象所占的内存 ↓ ③ 复用堆内存供新对象分配这条标记Mark→ 清除Sweep→ 内存返还与复用的主线是所有分代收集器如 Parallel GC、G1GC的共同基础逻辑。6.3 GC 与线程、性能的关系GC 主要在堆上发生且会在某些阶段触发全局停顿Stop-The-World因此是 JVM 调优和性能分析的核心话题。仓库内相关延伸材料还包括Java 中的 Thread多线程共享进程内资源时JVM 需要线程同步synchronized、wait/notify、Intrinsic Lock 等这与 GC 期间线程协调密切相关Java major feature changes记录了 JVM 默认 GC 的演进脉络——Java 8 默认从Serial GC变为Parallel GC多线程方式Java 9 起默认变为G1GC适合多处理器环境可用于理解 GC 选型的历史背景。七、JVM 知识点速查表面试自查问题答案要点JVM 是什么管理内存、为 Java 应用提供可移植运行环境的程序规范也是实际运行的进程在 Java 与 OS 间充当中间人JVM 的两大功能① 跨设备/OS 运行 Java 程序 ② 程序内存的管理与优化.java如何变成可执行javac 编译为.class字节码 → 类加载器动态加载链接 → 执行引擎解释/JIT → 在运行时数据区域执行类加载器五阶段加载 → 验证 → 准备 → 解析 → 初始化运行时数据区域有几个5 个PC 寄存器、JVM 栈、本地方法栈、堆、方法区其中堆与方法区为所有线程共享堆的特点存放对象与数组GC 的主要目标JVM 性能问题的高发区方法区的变迁Java 8 起 PermGen 被移除改为由 OS 自动调节的 Metaspace解释器 vs JIT解释器逐条解释慢JIT 将整体字节码编译为机器码后直接执行整体更快GC 做什么持续查找并删除不再被引用的对象 → 返还内存 → 复用堆内存GC 演进Serial → ParallelJava 8 默认→ G1GCJava 9 默认八、结语与仓库延伸阅读JVM 是 Java 技术栈的基石类加载器决定了字节码如何进入内存五大运行时数据区域决定了数据存放的位置与共享边界执行引擎决定了运行效率而 GC 决定了内存能否被安全回收。无论你是准备技术面试的新人还是在排查线上 OOM / GC 问题的工程师上述五条主线都值得完整掌握。本文所属的 tech-interview-for-developer 仓库围绕 JVM 还提供了丰富的姊妹篇建议按以下顺序串读Java 编译过程从源码到字节码再到执行引擎的完整链路与本文二、三、五章互补Java major feature changesJava 8/9/10/11 的 JVM 相关变更Metaspace、默认 GC 演进Interned String in Java用代码示例验证常量池方法区中运行时常量池的一部分的对象复用行为Java 中的 Thread从 JVM 调用栈JVM 栈与线程同步角度理解多线程在 JVM 中的落地Intrinsic LockJVM 线程同步monitor lock的内存语义与可见性保障Memory从操作系统层理解内存管理、MMU、分页等底层机制可与 JVM 内存管理对照学习。赞分享教程知识库【免费下载链接】tech-interview-for-developer 신입 개발자 전공 지식 기술 면접 백과사전 项目地址https://gitcode.com/GitHub_Trending/te/tech-interview-for-developer点击查看免费下载相关推荐JCSprout JVM内存管理从类加载到垃圾回收JCSprout JVM内存管理从类加载到垃圾回收 本文深入探讨了JVM内存管理的核心机制涵盖了从类加载到垃圾回收的全过程。首先详细解析了双亲委派模型的工作文档知识库后端教程深入理解JVM内存分配与垃圾回收机制深入理解JVM内存分配与垃圾回收机制 前言 Java虚拟机 JVM 的内存管理机制是Java程序员必须掌握的核心知识之一。本文将基于项目中的内存分配与回收策略文文档教程猫抓浏览器扩展三步搞定网页视频音频资源下载的终极指南猫抓浏览器扩展三步搞定网页视频音频资源下载的终极指南 猫抓cat catch是一款功能强大的浏览器资源嗅探扩展能够智能识别并下载网页中的视频、音频等媒体音视频上一篇StarRocks 2.3 版本发布详解主键表持久化索引、Pipeline 引擎默认开启与全系列补丁演进下一篇Kubernetes SIG UI 2021 年度报告全解读Dashboard v2.2–v2.5 发布、技术栈现代化与国际化治理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑