JVM知识梳理
JVM知识梳理作者没有四次元口袋的蓝胖日期2026-07-30标签Java, JVM, 运行时数据区, 堆, 栈, 方法区JVM 内存模型是 Java 面试的必考题。重点掌握堆、栈、方法区三个核心区域其他区域了解即可。一、整体划分JVM 运行时数据区分为线程私有和线程共享两部分JVM 运行时数据区 ├── 线程私有每个线程独立随线程创建/销毁 │ ├── 程序计数器PC Register │ ├── 虚拟机栈VM Stack │ └── 本地方法栈Native Method Stack ├── 线程共享所有线程共用JVM 启动时创建 │ ├── 堆Heap │ └── 方法区Method Area └── 直接内存Direct MemoryNIO 使用不属于 JVM 运行时数据区面试关键区分线程私有 → 随线程生灭不会有并发问题线程共享 → 需要考虑线程安全和 GC二、虚拟机栈VM Stack— 重点2.1 作用存储方法的局部变量表、操作数栈、动态链接、方法出口地址。每次方法调用都会在栈中创建一个栈帧方法执行完毕栈帧出栈。┌─────────────────────────────┐ │ 方法调用 3 │ ← 栈顶当前执行的方法 │ ┌─────────────────────┐ │ │ │ 栈帧Frame │ │ │ │ - 局部变量表 │ │ │ │ - 操作数栈 │ │ │ │ - 动态链接 │ │ │ │ - 返回地址 │ │ │ └─────────────────────┘ │ ├─────────────────────────────┤ │ 方法调用 2 │ ├─────────────────────────────┤ │ 方法调用 1 │ ← 栈底 └─────────────────────────────┘2.2 局部变量表存储方法内的局部变量基本数据类型int、long、float、double、boolean、char、short、byte对象引用reference指向堆中对象的指针returnAddress 类型publicvoidtest(){inta10;// 局部变量表存 aintb20;// 局部变量表存 bObjectobjnewObject();// 局部变量表存引用对象在堆中}2.3 常见异常异常原因StackOverflowError栈深度超过限制递归太深、死循环调用OutOfMemoryError动态扩展栈时无法申请到足够内存2.4 面试高频问题Q栈和堆的区别维度栈堆存储内容局部变量、方法调用对象实例、数组线程私有是否所有线程共享生命周期随方法调用由 GC 管理分配速度快指针移动慢需要查找空闲内存大小较小默认 1MB较大默认物理内存的 1/4三、堆Heap— 重点3.1 作用存储对象实例和数组是 GC垃圾回收的主要区域。ObjectobjnewObject();// 引用在栈中对象在堆中3.2 堆的分代结构现代 JVM 把堆分为新生代和老生代堆Heap ├── 新生代Young Generation—— 占 1/3 │ ├── Eden 区80% │ ├── Survivor From10% │ └── Survivor To10% └── 老生代Old Generation—— 占 2/3对象生命周期新对象 → Eden 区 ↓Eden 满Minor GC Survivor From/To复制存活对象 ↓年龄达到阈值默认 15 老生代 ↓老生代满Major GC / Full GC 如果还是放不下 → OutOfMemoryError3.3 为什么分代新生代对象朝生夕死GC 频繁但每次回收量小复制算法效率高老生代对象存活率高GC 较少但每次回收量大标记-清除/标记-整理面试回答模板分代是为了提高 GC 效率。新生代用复制算法每次只复制少量存活对象老生代用标记-清除或标记-整理适合长期存活的对象。3.4 常见异常异常原因OutOfMemoryError堆内存不足对象太多、内存泄漏# JVM 参数调整堆大小-Xms512m# 初始堆大小-Xmx2048m# 最大堆大小四、方法区Method Area— 重点4.1 作用存储类信息、常量、静态变量、JIT 编译后的代码。注意方法区是规范定义的概念不同 JVM 实现不同。HotSpot 用永久代JDK 8 之前或元空间JDK 8实现。4.2 JDK 8 前 vs JDK 8版本实现方式位置JDK 7 及之前永久代PermGenJVM 进程内存JDK 8元空间Metaspace本地内存Native Memory为什么要改永久代大小固定容易 OOM元空间使用本地内存理论上不受 JVM 内存限制方便 HotSpot 与 JRockit 融合JRockit 没有永久代4.3 方法区存储内容方法区元空间 ├── 类信息Class类名、父类、接口、访问修饰符 ├── 字段信息Field字段名、类型、修饰符 ├── 方法信息Method方法名、参数、返回类型、字节码 ├── 常量池Constant Pool字面量、符号引用 ├── 静态变量Static Variables └── JIT 编译后的代码4.4 运行时常量池方法区中有一个运行时常量池是类加载后生成的。Strings1abc;// abc 在运行时常量池Strings2abc;// 同一个引用System.out.println(s1s2);// true4.5 常见异常异常原因OutOfMemoryError: Metaspace加载的类太多、元空间不足# JDK 8 调整元空间大小-XX:MetaspaceSize256m-XX:MaxMetaspaceSize512m五、其他区域5.1 程序计数器PC Register作用记录当前线程执行的字节码行号线程私有每个线程独立一个唯一不会 OOM 的区域线程 A 执行到第 10 行 → PC 10 线程 B 执行到第 20 行 → PC 205.2 本地方法栈Native Method Stack作用为 Native 方法服务如 C/C 编写的方法线程私有HotSpot 把本地方法栈和虚拟机栈合二为一5.3 直接内存Direct Memory作用NIO 引入通过DirectByteBuffer分配堆外内存不属于 JVM 运行时数据区避免 Java 堆和 Native 堆之间的数据复制提高 I/O 性能// 堆外内存ByteBufferbufferByteBuffer.allocateDirect(1024);六、各区域对比总结区域线程存储内容异常程序计数器私有字节码行号唯一不会 OOM虚拟机栈私有局部变量、方法调用StackOverflow / OOM本地方法栈私有Native 方法StackOverflow / OOM堆共享对象、数组OOM方法区共享类信息、常量、静态变量OOM直接内存—NIO 堆外内存OOM️ 思维导图速览JVM 运行时数据区 ├── 线程私有 │ ├── 程序计数器字节码行号唯一不会 OOM │ ├── 虚拟机栈栈帧局部变量表/操作数栈/动态链接/返回地址 │ └── 本地方法栈Native 方法 ├── 线程共享 │ ├── 堆对象实例分新生代/老生代 │ │ ├── 新生代Eden Survivor复制算法 │ │ └── 老生代标记-清除/标记-整理 │ └── 方法区JDK 8 用元空间本地内存 │ ├── 类信息、字段、方法 │ ├── 运行时常量池 │ └── 静态变量、JIT 代码 └── 直接内存NIO 堆外内存不属于运行时数据区 写在最后学习建议堆栈方法区必须讲清楚面试必问能说清栈存引用、堆存对象、方法区存类信息就过关分代结构要理解不是死记硬背理解为什么分代——新生代朝生夕死用复制算法老生代存活率高用标记-整理JDK 8 方法区变化要知道永久代 → 元空间原因是永久代大小固定容易 OOM元空间用本地内存更灵活常见异常要对应StackOverflow 对应栈OOM 对应堆/方法区面试会问什么情况下会抛什么异常面试回答模板Q说说 JVM 运行时数据区JVM 运行时数据区分为线程私有和线程共享两部分。线程私有包括程序计数器记录字节码行号唯一不会 OOM 的区域、虚拟机栈存储局部变量和方法调用每次方法调用创建一个栈帧、本地方法栈为 Native 方法服务。线程共享包括堆存储对象实例分新生代和老生代新生代用复制算法回收效率高老生代用标记-整理和方法区JDK 8 之前用永久代之后用元空间存储类信息、常量、静态变量。重点说一下堆和栈的区别栈存局部变量和引用堆存对象实例栈是线程私有的堆是共享的栈分配速度快但空间小堆分配速度慢但空间大。Q为什么堆要分新生代和老生代分代是为了提高 GC 效率。大部分对象朝生夕死放在新生代用复制算法每次只复制少量存活对象效率高少量长期存活的对象进入老生代用标记-清除或标记-整理算法适合存活率高的场景。这样不同区域用不同回收策略整体 GC 效率更高。

相关新闻

从C到Qt C++开发:面向对象、信号槽与内存管理实战指南

从C到Qt C++开发:面向对象、信号槽与内存管理实战指南

1. 从C到C:不仅仅是语法的跨越如果你已经精通C语言,现在想踏入Qt的C开发世界,那么恭喜你,你正站在一个非常有利的起点上。很多从C转过来的朋友,初期会觉得C“不就是C加了个类嘛”,但真正上手后,…

2026/7/31 4:45:45阅读更多 →
UE4SS适配UE5.4:从内存偏移到函数签名的完整逆向工程指南

UE4SS适配UE5.4:从内存偏移到函数签名的完整逆向工程指南

1. 项目概述:UE4SS与UE5.4的适配困局如果你是一名深度依赖UE4SS(Unreal Engine 4 Scripting System)进行游戏模组开发或逆向分析的开发者,那么从虚幻引擎4(UE4)升级到虚幻引擎5.4(UE5.4&#xf…

2026/7/31 4:45:44阅读更多 →
MCU电机驱动中的时隙控制:从原理到实践详解

MCU电机驱动中的时隙控制:从原理到实践详解

第一次在项目里接触“时隙控制”这个概念,是在调试一个直流电机驱动板的时候。当时电机转速总是不稳,明明PWM占空比设得挺合理,但电机就是时快时慢,偶尔还会突然卡顿一下。查了半天硬件没问题,最后才发现是定时器配置的…

2026/7/31 4:45:44阅读更多 →
从STL容器到自研哈希表:C++哈希表核心原理与实现详解

从STL容器到自研哈希表:C++哈希表核心原理与实现详解

1. 项目概述:从STL容器到自研哈希表在C的日常开发中,std::unordered_map和std::unordered_set是我们处理快速查找、去重问题的左膀右臂。它们基于哈希表实现,提供了平均O(1)时间复杂度的插入、删除和查找操作,性能远超基于红黑树的…

2026/7/31 6:02:09阅读更多 →
AMD Radeon显卡全史:从架构解析到二手选购实战指南

AMD Radeon显卡全史:从架构解析到二手选购实战指南

1. 项目概述:一份持续更新的显卡“族谱”如果你是一位硬件爱好者、二手淘金客,或者只是想搞清楚自己那台老电脑里那块显卡的“前世今生”,那么一份详尽、准确的历代显卡列表就是你的“藏宝图”。我整理这份《1996-2023历代AMD Radeon桌面显卡…

2026/7/31 6:02:09阅读更多 →
Python脚本打包成exe与GUI界面开发实战指南

Python脚本打包成exe与GUI界面开发实战指南

1. 从脚本到应用:为什么我们需要打包与UI如果你用Python写过一些实用的小工具,比如一个批量重命名文件的脚本,或者一个自动整理桌面文档的程序,你大概率会遇到一个尴尬的局面:你想把这个工具分享给不会编程的朋友或同事…

2026/7/31 6:02:09阅读更多 →
openpyxl PatternFill参数详解:patternType对颜色填充的影响与最佳实践

openpyxl PatternFill参数详解:patternType对颜色填充的影响与最佳实践

1. 项目缘起:一个看似简单却暗藏玄机的颜色填充需求最近在做一个数据报表自动化的项目,用到了Python的openpyxl库来处理Excel文件。需求很简单:根据数据的不同状态,给对应的单元格填充不同的背景色,比如“通过”用绿色…

2026/7/31 6:02:09阅读更多 →
07 FastAPI

07 FastAPI

FastAPI 入门 FastAPI 是什么? FastAPI 是 Python 里写 Web API 的框架,特点:特点说明快性能接近 Node.js、Go简单几行代码就能起一个 API自动文档启动后访问 /docs 有交互式文档类型注解和第 19 课的类型注解无缝配合它和 Flask、Django 的区…

2026/7/31 6:02:08阅读更多 →
SKY77652-31射频放大器芯片与MIPI RFFE接口应用解析

SKY77652-31射频放大器芯片与MIPI RFFE接口应用解析

1. SKY77652-31放大器芯片深度解析这款由Skyworks推出的射频前端模块,专为4G/5G移动设备设计。我在实际项目中多次使用该芯片,最突出的感受是其将功率放大器(PA)、低噪声放大器(LNA)、开关和滤波器集成在3mm3mm的超小封装内。这种高度集成化设计让PCB布局…

2026/7/31 6:00:08阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/30 15:03:16阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/30 12:22:27阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/30 15:13:02阅读更多 →
物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:40阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:41阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/31 0:49:33阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/31 5:08:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/30 15:43:46阅读更多 →