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 效率更高。

相关新闻

揭秘ComfyUI ControlNet Aux预处理器的智能缩放机制:为什么你的分辨率设置总是不准确?

揭秘ComfyUI ControlNet Aux预处理器的智能缩放机制:为什么你的分辨率设置总是不准确?

揭秘ComfyUI ControlNet Aux预处理器的智能缩放机制:为什么你的分辨率设置总是不准确? 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux …

2026/10/3 9:36:59 阅读更多 →
2026年AI Agent架构设计与实战:从范式跃迁到落地踩坑

2026年AI Agent架构设计与实战:从范式跃迁到落地踩坑

前言:从"AI工具"到"AI Agent",不只是叫法变了 2023年,大家把大模型当"超级搜索引擎"用——你问一句,它答一句,完事。 2024年,开始流行"AI工具"——给它配几个API、…

2026/10/14 16:29:05 阅读更多 →
浏览器网络请求控制神器:Header Editor 终极免费指南

浏览器网络请求控制神器:Header Editor 终极免费指南

浏览器网络请求控制神器:Header Editor 终极免费指南 【免费下载链接】HeaderEditor Manage browsers requests, include modify the request headers, response headers, response body, redirect requests, cancel requests 项目地址: https://gitcode.com/gh_m…

2026/10/3 14:13:04 阅读更多 →

最新新闻

SpringBoot多模块项目实战:解耦、复用与云原生落地

SpringBoot多模块项目实战:解耦、复用与云原生落地

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

2026/10/15 1:39:05 阅读更多 →
STM32F103光敏传感器稳定采样与非线性补偿实战

STM32F103光敏传感器稳定采样与非线性补偿实战

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

2026/10/15 1:39:05 阅读更多 →
MATLAB二维绘图实战:从数据准备到高质量导出的完整指南

MATLAB二维绘图实战:从数据准备到高质量导出的完整指南

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

2026/10/15 1:39:05 阅读更多 →
C++实现AVL树:从平衡原理到指针旋转的工程实践

C++实现AVL树:从平衡原理到指针旋转的工程实践

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

2026/10/15 1:39:05 阅读更多 →
两串锂电池均衡实战:MP2642GR-Z与PIC18LF46K42打造可靠BMS

两串锂电池均衡实战:MP2642GR-Z与PIC18LF46K42打造可靠BMS

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

2026/10/15 1:39:05 阅读更多 →
JavaWeb学生信息管理系统课程设计全解析:从表结构到答辩技巧

JavaWeb学生信息管理系统课程设计全解析:从表结构到答辩技巧

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

2026/10/15 1:38:05 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/14 7:53:34 阅读更多 →