堆内存:对象的诞生地与分代设计

引言:对象的家园 当你写下这行代码时: User user = new User(); 这个User对象存储在哪里?答案是:堆(Heap)。 堆是JVM管理的 最大的内存区域,也是 垃圾收集器的主战场。理解堆的结构和工作原理,是掌握Java内存管理和性能调优的基础。 为什么堆如此重要? 90%以上的对象实例存储在堆中 堆内存不足是最常见的OOM原因 垃圾回收主要发生在堆中 堆的大小直接影响应用性能 本文将深入理解堆的分代设计、分代假说、以及对象的分配策略。 什么是堆? 核心定义 堆(Heap) 是JVM管理的最大内存区域,用于存储 几乎所有的对象实例和数组。 关键特点: 线程共享:所有线程共享同一个堆 动态分配:对象的创建和销毁是动态的 GC管理:堆是垃圾收集器的主要工作区域 可调整大小:通过JVM参数调整堆的大小 堆的基本参数 通过JVM参数控制堆的大小: # -Xms: 初始堆大小(起始大小) # -Xmx: 最大堆大小 # 建议: 生产环境中将两者设置为相同值,避免堆动态扩展的开销 # 示例1:设置初始堆512MB,最大堆2GB java -Xms512m -Xmx2g MyApp # 示例2:设置固定堆大小为1GB java -Xms1g -Xmx1g MyApp # 示例3:查看堆信息 java -XX:+PrintFlagsFinal -version | grep HeapSize 常见配置: 应用类型 推荐堆大小 说明 小型应用 512MB - 1GB 适合个人项目、小型Web应用 中型应用 2GB - 4GB 适合中等规模的企业应用 大型应用 8GB - 16GB 适合高并发、大数据应用 超大型应用 32GB+ 适合超大规模、内存密集型应用 堆的分代设计 为什么要分代? 在深入分代结构之前,先理解 为什么要分代。 ...

2025-11-20 · maneng

垃圾回收算法(下):标记-整理、分代收集

引言:完善的垃圾回收方案 上一篇我们学习了两种基础算法: 标记-清除:简单但有碎片 标记-复制:无碎片但浪费空间 本文将学习另外两种算法,它们解决了前两种算法的缺陷: 标记-整理:无碎片且不浪费空间 分代收集:综合运用多种算法,是现代JVM的主流方案 标记-整理算法(Mark-Compact) 核心思想 分三个阶段: 标记阶段(Mark):标记所有存活对象 整理阶段(Compact):将存活对象移动到内存一端 清除阶段(Sweep):清除边界外的所有内存 与标记-清除的区别 算法 清除方式 内存布局 标记-清除 直接释放死亡对象 分散,有碎片 标记-整理 移动存活对象后清除 紧凑,无碎片 详细流程 阶段1:标记(Mark) 从GC Roots开始,标记所有可达对象。 GC Roots开始遍历 ↓ 标记对象A(可达) ↓ 标记对象B(A引用) ↓ 标记对象C(B引用) ↓ 完成标记 阶段2:整理(Compact) 将所有存活对象移动到内存的一端,使其紧密排列。 整理前: ┌────┬────┬────┬────┬────┬────┬────┬────┐ │ A │ 空 │ C │ 空 │ E │ 空 │ 空 │ H │ └────┴────┴────┴────┴────┴────┴────┴────┘ 整理后: ┌────┬────┬────┬────┬────────────────────┐ │ A │ C │ E │ H │ 空 │ └────┴────┴────┴────┴────────────────────┘ 阶段3:清除(Sweep) 清除边界后的所有内存。 ...

2025-11-20 · maneng

如约数科科技工作室

浙ICP备2025203501号

👀 本站总访问量 ...| 👤 访客数 ...| 📅 今日访问 ...