JVM内存模型详解:堆、栈、方法区与垃圾回收

JVM内存模型核心结构

JVM内存模型主要划分为堆、虚拟机栈、方法区和程序计数器等区域,各区域承担不同职责且具有独特特性。

堆(Heap)

  • 存储对象实例和数组,所有线程共享
  • 分为新生代(Eden、Survivor0/1)和老年代
  • 默认最大容量为物理内存1/4,可通过-Xmx参数调整
  • 发生OOM时抛出OutOfMemoryError

虚拟机栈(Stack)

  • 线程私有,生命周期与线程相同
  • 存储栈帧(局部变量表、操作数栈、动态链接、方法出口)
  • 栈深度超过限制时抛出StackOverflowError
  • 可通过-Xss参数调整栈大小(默认1MB)

方法区(Method Area)

  • 存储类信息、常量、静态变量、JIT编译代码
  • JDK8后由元空间(Metaspace)实现,使用本地内存
  • 触发Full GC时回收类型信息
  • 大小通过-XX:MetaspaceSize参数配置

垃圾回收机制

分代收集理论

  • 新生代采用复制算法(Minor GC)
  • 老年代采用标记-清除/整理算法(Major GC)
  • 触发条件:新生代Eden区满触发Minor GC,老年代空间不足触发Full GC

GC算法实现

java 复制代码
// 引用计数法(存在循环引用问题)
class Object {
    int refCount = 0;
}

// 可达性分析算法(JVM实际采用)
// GC Roots包括:虚拟机栈引用、静态变量、常量、JNI引用

垃圾收集器类型

  • Serial:单线程STW,适合客户端
  • Parallel Scavenge:吞吐量优先
  • CMS:低延迟,JDK9废弃
  • G1:区域化分代,JDK9默认
  • ZGC:TB级堆,<10ms停顿

内存参数配置示例

常见JVM参数

shell 复制代码
-Xms4g -Xmx4g        # 堆初始/最大内存
-XX:NewRatio=2       # 老年代/新生代比例
-XX:SurvivorRatio=8 # Eden/Survivor比例
-XX:+UseG1GC        # 启用G1收集器

内存溢出场景分析

modelscope.cn/learn/68085

modelscope.cn/learn/68083

modelscope.cn/learn/68081

modelscope.cn/learn/68079

modelscope.cn/learn/68077

modelscope.cn/learn/68075

modelscope.cn/learn/68073

modelscope.cn/learn/68070

modelscope.cn/learn/68069

modelscope.cn/learn/68066

modelscope.cn/learn/68151

modelscope.cn/learn/68149

modelscope.cn/learn/68148

modelscope.cn/learn/68145

modelscope.cn/learn/68144

堆溢出

java 复制代码
// 持续创建大对象
List<byte[]> list = new ArrayList<>();
while(true) {
    list.add(new byte[1024*1024]);
}

栈溢出

java 复制代码
// 递归调用无终止条件
void stackOverflow() {
    stackOverflow();
}

方法区溢出

  • 动态生成大量类(如CGLib)
  • 大量JSP动态编译
  • 大量反射调用

监控工具建议

  1. jstat -gcutil [pid] 实时GC统计
  2. jmap -heap [pid] 堆内存分析
  3. VisualVM图形化监控
  4. MAT内存分析工具定位泄漏对象

通过合理配置内存参数和选择垃圾收集器,可优化应用性能。建议根据应用特点(吞吐量/延迟敏感)选择收集器,并通过压测验证配置效果。

相关推荐
先吃饱再说2 分钟前
为什么堆能 O(log n) 插入?拆解完全二叉树的数组魔法
算法·排序算法
掉鱼的猫8 分钟前
把 OpenAPI 接入 Agent Harness:零代码让 Agent 听懂你的 REST API
java·llm·agent
lzhcoder12 分钟前
Spring Boot 集成 Kafka:先跑通 Demo,再避开那 80% 的人踩过的坑
java·kafka
留白_32 分钟前
【决策树】泰坦尼克号生存预测
算法·决策树·机器学习
plainGeekDev36 分钟前
ProGuard → R8
android·java·kotlin
hqzing42 分钟前
鸿蒙 PC 底层开发技术详解(七):二进制自签名算法的实现
算法·华为·harmonyos
带刺的坐椅1 小时前
把 OpenAPI 接入 Agent Harness:零代码让 Agent 听懂你的 REST API
java·ai·llm·agent·solon·restapi·openapi
AI科技星1 小时前
超复数全域经济周期场与信息谱场——金融与密码学底层理论重构《0·1·∞三元一体全域超复数统一场论》系列全集(六一字不漏完整合订终版)
人工智能·算法·金融·密码学·拓扑学·乖乖数学·全域数学
AI科技星1 小时前
《01无穷全域信息场论:算子G与宇宙本体高维完备公理大典》
人工智能·python·算法·金融·乖乖数学·全域数学
Geek-Chow1 小时前
微服务认证与授权:01 — 概念
java·前端·数据库