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内存分析工具定位泄漏对象

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

相关推荐
这个昵称不容易25 分钟前
SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在
java·springboot·毕设
计算机毕设定制辅导-无忧学长1 小时前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统
文丑颜不良啊2 小时前
LeetCode2221~2240题目解析
java·leetcode
秋饼2 小时前
Computer Use Agent Java 落地实战:感知-行动循环、执行器与安全围栏生产级实现
java·ai·技术分享·后端开发
Navigator_Z2 小时前
LeetCode //C - 1317. Convert Integer to the Sum of Two No-Zero Integers
c语言·算法·leetcode
D e re k ZH3 小时前
C++ 标准库算法全景指南
数据结构·c++·算法
冻柠檬飞冰走茶4 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
文丑颜不良啊4 小时前
LeetCode2161~2180题目解析
java·leetcode
雪落漂泊4 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法