news 2026/4/30 18:18:09

JVM篇1:java的内存结构 + 对象分配理解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JVM篇1:java的内存结构 + 对象分配理解

JVM 内存结构 + 对象分配详解(HotSpot 虚拟机,JDK 8 ~ 21+ 主流版本)

下面内容基于 HotSpot JVM(Oracle/OpenJDK 默认实现),2025–2026 年主流生产环境基本没有大变化(PermGen 已彻底移除,Metaspace 仍是常态)。

一、JVM 运行时数据区整体划分(线程共享 vs 线程私有)

JVM 内存主要分为以下几个逻辑区域:

区域名称是否线程共享生命周期主要存储内容可能抛出的 OOM 异常是否会 GC
程序计数器 (PC Register)私有线程生命周期当前线程执行的字节码指令地址(分支、循环、异常跳转等)几乎不会 OOM
Java 虚拟机栈 (VM Stack)私有线程生命周期栈帧(局部变量表、操作数栈、动态链接、方法出口等)StackOverflowError / OOM
本地方法栈 (Native Method Stack)私有线程生命周期native 方法(JNI 调用 C/C++)的栈帧StackOverflowError / OOM
Java 堆 (Heap)共享JVM 启动 ~ 关闭几乎所有对象实例、数组OutOfMemoryError: Java heap space是(重点 GC 区域)
元空间 (Metaspace)共享JVM 启动 ~ 关闭类元数据、方法字节码、常量池、符号引用、注解等OutOfMemoryError: Metaspace是(Full GC 时可能回收)
直接内存 (Direct Memory)NIO ByteBuffer.allocateDirect() 分配的 off-heap 内存OutOfMemoryError: Direct buffer memory否(手动或 GC 间接回收)

最核心一句话记忆

二、HotSpot JVM 堆内存详细布局(分代 + G1 时代主流视图)

现代 HotSpot(JDK 8+)默认使用分代思想,但具体收集器不同,物理布局有差异。

1. 最经典的分代布局(Parallel / CMS 时代常见)
Heap ├── Young Generation(新生代) ≈ 1/3 heap │ ├── Eden(伊甸园) ≈ 8/10 young │ └── Survivor(幸存者区)×2 From / To 各 ≈ 1/10 young └── Old Generation(老年代 / 养老区) ≈ 2/3 heap
2. G1 收集器时代(JDK 9+ 默认,2025–2026 生产主流)

G1 已经取消严格的连续 Young/Old 区域,而是把整个堆切成很多个Region(默认 2048 个,可调):

G1 内存布局示意(逻辑分代,物理碎片化):

Heap → 很多个 Region(大小相等) ┌───────────────┐ │ Eden Regions │ ├───────────────┤ │ Survivor Regs │ ├───────────────┤ │ Old Regions │ ├───────────────┤ │ Humongous Reg │ ← 大对象专用 └───────────────┘

三、Java 对象创建 & 内存分配全过程(面试高频)

new 对象时 JVM 做了什么?(8 个步骤)

  1. 类加载检查
    遇到 new 指令 → 先检查常量池中是否有该类的符号引用 → 如果没有则触发类加载(加载 → 链接 → 初始化)

  2. 分配内存(核心步骤)
    在堆中划出一块确定大小的内存给对象(对象大小在类加载后已知)。

    分配方式两种(取决于堆是否规整):

    方式适用收集器堆是否规整原理并发安全解决方案
    指针碰撞Serial / ParNew指针向空闲端移动 size 距离TLAB(线程本地分配缓冲)
    空闲列表CMS / G1(部分情况)从空闲列表中找一块足够大的空间CAS + 失败重试

    TLAB(Thread Local Allocation Buffer)是 HotSpot 解决并发分配的优化:

  3. 初始化零值
    分配的内存空间(对象头除外)全部置为零值(保证字段不赋初值也能用)

  4. 设置对象头

  5. 执行 方法(构造器)
    按照代码顺序执行父类构造 → 成员变量显式赋值 → 构造代码块 → 构造方法体

四、对象分配的“特殊规则”(面试加分项)

  1. 大对象直接进老年代
    -XX:PretenureSizeThreshold=(默认 0)
    大于这个值的对象直接分配到老年代(避免在 Survivor 来回复制)

  2. 动态年龄判定(Survivor 区晋升老年代规则)
    如果 Survivor 空间中相同年龄的所有对象大小总和 > Survivor 空间的一半(默认 50%,-XX:TargetSurvivorRatio),年龄 >= 该年龄的对象直接晋升老年代

  3. 长期存活的对象进入老年代
    默认经历 15 次 Minor GC 后晋升(-XX:MaxTenuringThreshold=15)

  4. 空间分配担保
    Minor GC 前,老年代最大可用连续空间 < 新生代所有对象总大小 → 提前 Full GC

五、快速记忆口诀(面试背诵版)

内存结构口诀
“程栈本堆元,私私私共共”
程序计数器、虚拟机栈、本地方法栈(私有)
堆、元空间(共享)

堆内布局口诀(分代时代):
“新生伊甸幸存俩,老年养老养老家”

对象分配口诀
“先查类加载 → 指针碰撞或空闲列表 → TLAB 加速 → 零值填充 → 对象头 → 构造执行”

晋升老年代三板斧
大 → 直接老
老 → 年龄阈值(默认 15)
多 → 动态年龄判定(同龄 > Survivor/2)

希望这篇能让你对 JVM 内存结构 + 对象分配有清晰的整体认知。
下一期想看哪个方向?

随时告诉我!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 5:12:50

基于PSO-GA混合算法的施工进度计划多目标优化,以最小化总成本并实现资源均衡,满足工期约束和资源限制附MATLAB代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

作者头像 李华
网站建设 2026/5/1 2:28:54

AI软件工程落地:IQuest-Coder-V1开源模型实战指南

AI软件工程落地&#xff1a;IQuest-Coder-V1开源模型实战指南 你是否还在为复杂的代码调试、低效的开发流程或难以维护的项目结构而头疼&#xff1f;有没有一种AI模型&#xff0c;能真正理解代码的“演化逻辑”&#xff0c;而不仅仅是静态地补全几行函数&#xff1f;现在&…

作者头像 李华
网站建设 2026/5/1 8:07:50

基于ModelScope的unet部署教程:快速搭建AI画师系统

基于ModelScope的unet部署教程&#xff1a;快速搭建AI画师系统 1. 教程目标与前置准备 你是否也想拥有一个能自动把真人照片变成卡通头像的小工具&#xff1f;今天我们就来手把手教你&#xff0c;如何用阿里达摩院 ModelScope 上的 cv_unet_person-image-cartoon 模型&#x…

作者头像 李华
网站建设 2026/5/1 6:39:17

GPEN浏览器兼容性指南:Chrome/Edge/Firefox最佳实践

GPEN浏览器兼容性指南&#xff1a;Chrome/Edge/Firefox最佳实践 1. 引言&#xff1a;为什么浏览器选择如此重要&#xff1f; 你是不是也遇到过这种情况&#xff1a;在一台电脑上GPEN运行流畅&#xff0c;换台设备却卡顿、加载失败&#xff0c;甚至界面错乱&#xff1f;问题很…

作者头像 李华
网站建设 2026/5/1 4:43:41

学霸同款10个AI论文网站,助你轻松搞定本科毕业论文!

学霸同款10个AI论文网站&#xff0c;助你轻松搞定本科毕业论文&#xff01; 论文写作的“秘密武器”&#xff0c;你真的了解吗&#xff1f; 在本科毕业论文的写作过程中&#xff0c;很多同学都曾陷入过“写不下去”“思路混乱”“查重压力大”的困境。尤其是随着AI技术的广泛…

作者头像 李华
网站建设 2026/5/1 7:46:37

WinBtrfs vs NTFS:现代文件系统的效率对比分析

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个WinBtrfs与NTFS性能对比测试工具&#xff0c;功能包括&#xff1a;1. 自动化基准测试&#xff08;读写速度、随机访问等&#xff09;&#xff1b;2. 存储空间利用率比较&a…

作者头像 李华