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/7/31 4:44:26 阅读更多 →
2026年AI Agent架构设计与实战:从范式跃迁到落地踩坑

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

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

2026/7/31 4:44:26 阅读更多 →
浏览器网络请求控制神器: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/7/31 4:44:26 阅读更多 →

最新新闻

UnityHub安装Android模块失败:公司网络环境下的深度排查与双版本修复方案

UnityHub安装Android模块失败:公司网络环境下的深度排查与双版本修复方案

1. 项目概述:当UnityHub在公司电脑上“罢工”如果你是一名在公司环境下使用Unity进行移动端开发的工程师,那么对下面这个场景一定不会陌生:你兴冲冲地打开UnityHub,准备为项目安装或更新Android Build Support模块,点击…

2026/7/31 5:22:42 阅读更多 →
小升初数学思维训练:94集系统化培养逻辑推理与问题解决能力

小升初数学思维训练:94集系统化培养逻辑推理与问题解决能力

最近在帮亲戚家孩子准备小升初,发现一个很有意思的现象:很多家长还在让孩子刷题海战术,但真正拉开差距的其实是数学思维。那些能考上重点初中实验班的孩子,往往不是最勤奋的,而是最会思考的。小升初数学早已不是简单的…

2026/7/31 5:22:42 阅读更多 →
Q-learning算法实战:从零实现迷宫智能体与强化学习核心原理

Q-learning算法实战:从零实现迷宫智能体与强化学习核心原理

1. 项目概述:当AI学会“试错”,迷宫不再是难题最近在重温一些经典的AI算法,发现Q-learning这个老伙计依然魅力不减。它不像现在动辄需要海量数据和算力的大模型,而是用一种非常“朴素”的智慧——试错与反馈,来教会智能…

2026/7/31 5:22:42 阅读更多 →
Unity内置管线迁移HDRP实战:从材质转换到性能调优全流程

Unity内置管线迁移HDRP实战:从材质转换到性能调优全流程

1. 项目概述:为什么我们要从内置管线迁移到HDRP?如果你是一个在Unity内置渲染管线(Built-in Render Pipeline)里摸爬滚打了几年的开发者,手头可能正维护着一个或多个“历史悠久”的项目。这些项目运行稳定,…

2026/7/31 5:22:42 阅读更多 →
手机功耗全解析:从硬件原理到省电技巧,告别电量焦虑

手机功耗全解析:从硬件原理到省电技巧,告别电量焦虑

1. 项目概述:为什么我们需要关心手机功耗?手机功耗,听起来是个挺技术、挺枯燥的词,对吧?但如果你经历过手机电量在关键时刻“尿崩”,或者感觉新手机用了一年续航就大不如前,那你其实已经和“功耗…

2026/7/31 5:22:42 阅读更多 →
Word转PDF终极评测:四大方法对比与场景化选择指南

Word转PDF终极评测:四大方法对比与场景化选择指南

1. 从一次“论文提交”事故说起前几天,我的一位同事差点因为一份格式错乱的PDF文件,搞砸了一个重要的项目申报。他花了一整天在Word里精心排版,图表、页眉页脚、公式都完美无缺,最后点击“另存为PDF”,信心满满地发了出…

2026/7/31 5:21:41 阅读更多 →

日新闻

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

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

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

2026/7/31 0:00:34 阅读更多 →
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:34 阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

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

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

2026/7/31 0:00:34 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻