JVM 的内存结构如何划分?
未标记
考查重点:线程私有与共享运行时区域。线程私有PC/栈,共享堆方法区,常量池属方法区,规范区域与实现布局分开
本题目录
参考答案
核心回答
按《Java虚拟机规范》的运行时数据区来讲,可以先分成两组:每个线程自己的程序计数器、Java 虚拟机栈,以及实现所需的本地方法栈;各线程共享的堆和方法区。运行时常量池属于方法区的一部分。
各区域的职责是:
- 程序计数器:记录当前线程正在执行的
JVM指令位置;执行native方法时,其值在规范中未定义。 Java虚拟机栈:保存方法调用的栈帧。栈帧包含局部变量表、操作数栈,以及动态链接和方法返回等所需信息;方法正常返回或异常退出时,对应栈帧结束。- 本地方法栈:支持
native方法等本地执行。它的具体结构和是否单独实现由虚拟机决定,不能直接套用Java栈帧的全部结构。 - 堆:在规范抽象中,为类实例和数组分配空间,由各线程共享,是垃圾收集管理的重要区域。
- 方法区:保存类级结构,例如字段和方法数据、方法代码、运行时常量池。规范规定职责,具体存储布局由虚拟机实现决定。
这里讨论的是运行时内存区域;JMM 则主要回答线程间共享变量的可见性、有序性等并发规则,两者需要区分。
堆和栈怎样配合?
假设一个方法创建了用户对象,并把引用保存在局部变量中。可以理解为:当前调用的栈帧保存局部引用,对象本身在堆中;另一个线程也可能持有指向同一个对象的引用。
因此,“栈是线程私有的”并不能推出“局部变量引用的对象一定不会被其他线程访问”。方法返回后,栈帧结束;若对象仍被其他可达引用持有,它也不会因为这个方法返回就立即回收。JIT 还可能消除部分对象的实际分配,不能把源代码中的每次 new 都直接等同于一次实际堆分配。
方法区、永久代和元空间是什么关系?
方法区是规范中的逻辑区域,永久代和元空间是讨论 HotSpot 实现时使用的概念。
HotSpot 在 JDK 8 移除了永久代,类元数据改由使用本地内存的元空间等设施保存;方法区所代表的职责仍然存在。不能把这理解成“规范删掉了方法区”,也不能把所有与类相关的数据和所有堆外内存都统称为元空间。
元空间同样有容量风险。以 JDK 25 的参数定义为例,-XX:MaxMetaspaceSize 可以限制类元数据使用的本地内存;未设置这个上限,也仍受可用本地内存和进程环境约束,并不代表不会溢出。
JVM 进程的内存只有这些吗?
运行时数据区是逻辑分类,排查进程内存时还需要看具体实现的物理占用,例如线程栈、元空间、JIT 代码缓存、NIO 直接缓冲区和其他本地库分配。
所以,-Xmx 限制 Java 堆,不能拿它当作整个 Java 进程的内存上限。直接内存也不是规范另外规定的一个运行时数据区;-XX:MaxDirectMemorySize 主要约束 NIO 直接缓冲区分配,不覆盖任意本地库的全部内存。
常见追问
哪些区域可能报内存相关错误? 栈所需深度超过允许范围可能抛 StackOverflowError;规范允许动态扩展的栈在扩展失败,或新线程初始栈无法分配时,可能抛 OutOfMemoryError。堆和方法区无法满足分配也可能 OOM。程序计数器则没有规范规定的 OOM 情形。
堆是否一定分为 Eden、两个 Survivor 和老年代? 这些是具体垃圾收集器的组织方式,不是所有 JVM 实现都必须采用的物理布局。回答运行时数据区时先说明堆的职责,再结合实际收集器讨论分代和 Region。
参考资料
- 国内:JavaGuide:Java内存区域详解:线程私有与共享区域、栈帧和方法区演进部分用于梳理各区域职责,并解释对象引用、对象本身和实际分配优化的区别。
- 国内:沉默王二:深入理解JVM的运行时数据区:方法调用对应栈帧、堆中对象生命周期和元空间的讨论,用于把区域划分连接到一次方法调用的执行过程。
- 国内:纪兵 / 美团:Spring Boot引起的“堆外内存泄漏”排查及经验总结:对堆、代码区域和本地分配分别排查的过程,说明为什么堆使用量不能代表整个进程的内存占用。
- 国外:Java虚拟机规范 SE 25:运行时数据区与栈帧:第2.5、2.6节定义各区域的归属、用途、栈帧生命周期和异常条件,是逻辑划分与实现自由度的依据。
- 国外:JDK 25:java命令说明:堆、线程栈、元空间与直接缓冲区参数的说明,用于核对各上限具体限制哪类内存,避免把堆上限扩大为进程上限。
相关面经
42 篇阿里巴巴
后端开发 / Agent 开发腾讯
后台开发线程共享和线程独占介绍一下
浩鲸
AI应用开发工程师(java方向,国内)jvm内存结构
水滴
AI 全栈工程师进程和线程的区别?JVM中有哪些部分是线程共享的哪些是独有的?
BIGO
客户端开发JVM 运行时内存区域、StackOverflowError、OutOfMemoryError
展开剩余 37 篇面经
去哪儿
AI 应用开发JVM运行时数据区的核心构成,以及各区域的核心作用。
老虎国际
后端开发Java内存管理是怎样的?垃圾回收机制是怎样的?
极兔速递
后端开发工程师JVM 内存区域划分
蚂蚁集团
说下 JVM 内存模型吧,JVM 的方法区和元空间有啥关系?元空间是完全替代方法区了吗?
蚂蚁集团
JVM内存结构
星龙数智
Java / 大模型开发JVM内存区域是如何划分的
平安科技
后端全栈开发讲讲JVM内存区域划分。
招银云创
后端开发JVM了解吗?Java 内存区域大概分为哪几块?哪些变量存在栈里?栈上变量 / 方法是否线程安全?
唯智信息
Java 开发实习生JVM分区
高途
后端开发JVM:运行时内存区域、线程共享/私有、栈帧结构、对象如何判断可以回收、GC 算法和垃圾收集器
趣链科技
JVM 的内存区域?new 关键字会放在哪里?静态的对象呢?
百度
问了一些java的八股,麻了,主要一开始想着测开,没太准备八股,结果问了jvm内存里面有哪些,回答了一个堆,栈,常量区。然后问我gc,我一开始还没反应过来。 然后是java的多线程怎么创建,就回答了一个thread和一个runable。也不知道对不对
广电数科
Java 开发工程师说一下JVM组成
顺丰
Java 开发工程师jvm内存结构
去哪儿
AI 全栈开发工程师JVM运行时的数据有哪些?各自有什么作用?
快手
了解的 JVM 内存吗?
小鹏
后端开发工程师(AI / Agent 方向)讲一下 JVM 内存区域(线程私有部分、共享部分、方法区的演进)?
阿里巴巴
AI 应用开发工程师CVTE
AI 应用开发介绍一下java的jvm的内存是怎么划分的
公司未注明
软件开发JVM堆内存、栈内存、方法区分别存储什么内容;常量、静态变量、动态变量存放位置
字节跳动
后端开发工程师Java的运行内存有哪些? 你怎么理解堆和栈? 你知道 在数据层面上的二者本质区别吗?
百度
后端开发14 java内存管理 堆 介绍g1
滴滴
国际化后端开发介绍下jvm运行时数据区
华为
Java 开发JVM内存区域划分
快手
后端开发实习生JVM 的内存区域(运行时数据区)
虾皮
后端实习JVM 的内存分配是怎么做的?(提到了运行时内存区)
熙牛医疗
Java 驻场开发jvm的内存管理机制
阿里巴巴
Java 开发工程师JVM 里面主要的组件有哪些?JVM 的体系了解吗?能讲一下 JVM 的内存模型吗?
有赞
JavaJVM 内存结构是怎样的?如果做一个高并发的在线社区系统,你会如何选择和配置垃圾回收器?考虑哪些因素?
阿里巴巴
后端开发工程师(AI)说说 Java 的内存模型?堆和栈的区别是什么?
阿里巴巴
AI agent平台研发工程师java创建一个对象,虚拟机会有哪些变化?JVM的内存会有哪些变化?
腾讯
后端开发实习生jvm内存是怎样的?现在创建一个包括age和name的person类,讲讲它涉及的jvm底层
影石创新
AI 开发JVM 的内存结构包括哪几个区?
飞猪
Java 后端开发13jvm内存模型,常量在哪里;方法区里面什么
字节跳动
后端开发JVM 内存模型结构是什么?
腾讯
后台开发讲一下JVM模型吧(梅开二度)
字节跳动
后端开发工程师(AI / Agent 方向)java内存模型 垃圾回收










