当前位置: 首页 > news >正文

JVM的垃圾回收机制

一、垃圾回收基础概念

1. 什么是垃圾回收

垃圾回收(Garbage Collection, GC)是JVM自动管理内存的机制,主要负责:

  • 分配内存

  • 确保被引用的对象保持在内存中

  • 回收不再被引用的对象占用的内存

2. 需要回收的内存区域

  • 堆内存(Heap):主要回收区域,存放对象实例

  • 方法区(Metaspace):回收废弃常量和无用的类

二、判断对象可回收的算法

1. 引用计数法(已淘汰)

  • 每个对象维护一个引用计数器

  • 当引用为0时立即回收

  • 缺点:无法解决循环引用问题

2. 可达性分析算法(主流)

通过"GC Roots"对象作为起点,向下搜索引用链:

  • GC Roots包括

    • 虚拟机栈中引用的对象

    • 方法区静态属性引用的对象

    • 方法区常量引用的对象

    • Native方法引用的对象

    • 同步锁持有的对象

三、垃圾回收算法

1. 标记-清除(Mark-Sweep)

  • 步骤

    1. 标记所有需要回收的对象

    2. 统一回收被标记对象

  • 缺点

    • 效率问题(标记和清除效率都不高)

    • 空间问题(产生内存碎片)

2. 标记-整理(Mark-Compact)

  • 步骤

    1. 标记所有需要回收的对象

    2. 让所有存活对象向一端移动

    3. 清理边界以外的内存

  • 优点:避免内存碎片

  • 缺点:移动对象成本高

3. 复制算法(Copying)

  • 原理

    • 内存分为大小相同的两块

    • 每次只使用其中一块

    • 存活对象复制到另一块,然后清理已使用块

  • 优点:高效无碎片

  • 缺点:内存利用率仅50%

4. 分代收集理论(Generational Collection)

  • 新生代(Young Generation)

    • 特点:对象朝生夕死(98%对象存活时间很短)

    • 算法:复制算法(Eden:Survivor=8:1:1)

  • 老年代(Tenured Generation)

    • 特点:存活对象较多

    • 算法:标记-清除或标记-整理

四、垃圾收集器实现

1. 新生代收集器

收集器算法特点
Serial复制单线程,Client模式默认
ParNew复制Serial的多线程版本
Parallel Scavenge复制吞吐量优先

2. 老年代收集器

收集器算法特点
Serial Old标记-整理Serial的老年代版
Parallel Old标记-整理Parallel Scavenge的老年代版
CMS标记-清除低延迟,并发收集

3. 全堆收集器

收集器算法特点
G1标记-整理+分区可预测停顿,JDK9+默认
ZGC着色指针+读屏障超低延迟(<10ms)

五、内存分配与回收策略

1. 对象优先在Eden分配

  • 新生代内存布局:

    ┌─────────┬───────┬───────┐
    │  Eden   │ S0    │ S1    │
    └─────────┴───────┴───────┘
  • 当Eden区满时触发Minor GC

2. 大对象直接进老年代

  • 通过-XX:PretenureSizeThreshold设置阈值

  • 避免在Eden和Survivor之间大量复制

3. 长期存活对象进老年代

  • 对象年龄计数器(Survivor中每熬过1次GC年龄+1)

  • -XX:MaxTenuringThreshold设置晋升阈值(默认15)

六、GC日志分析

1. 典型GC日志

[GC (Allocation Failure) [PSYoungGen: 65536K->10720K(76288K)] 
65536K->15011K(251392K), 0.0090413 secs] 
[Times: user=0.02 sys=0.01, real=0.01 secs]
  • PSYoungGen:Parallel Scavenge收集器

  • 65536K->10720K:回收前->回收后大小

  • 0.0090413 secs:耗时

2. 重要JVM参数

参数作用
-Xms/-Xmx初始/最大堆大小
-XX:NewRatio老年代与新生代比例
-XX:SurvivorRatioEden与Survivor区比例
-XX:+PrintGCDetails打印GC详细信息
-XX:+UseG1GC使用G1收集器

相关文章:

  • c/c++的opencv均值函数
  • 盲盒APP开发——解锁盲盒经济无限可能
  • 机器学习(14)——模型调参
  • ThreadLocal 源码深度解析
  • 【线下沙龙】NineData x Apache Doris x 阿里云联合举办数据库技术Meetup,5月24日深圳见!
  • YoloV8改进策略:卷积篇|风车卷积|即插即用
  • 【无用知识】如何做到高效率
  • 今日行情明日机会——20250519
  • 【MySQL成神之路】MySQL常用语法总结
  • 聊聊更新中断和更新事件那些事儿
  • Unity预制体变体(Prefab Variants)、接口(Interface)、抽象类(Abstract Class)、枚举(Enumeration)
  • 计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 13.几何着色器(二)爆炸效果修改图元类型
  • ARMv7的NVIC中断优先级
  • Timer-XL:长上下文Transformer模型引领时序预测新篇章
  • TransmittableThreadLocal实现上下文传递-笔记
  • 活学妙用——5W2H分析法
  • 深入理解 Redisson 看门狗机制:保障分布式锁自动续期
  • 【工具变量】A股上市公司企业大数据运用数据(2007-2023年)
  • HTTP由浅入深
  • 力扣303 区域和检索 - 数组不可变
  • 欧阳娜娜等20多名艺人被台当局列入重要查核对象,国台办回应
  • 多所院校高规格召开考研动员会,有学院考研报名率达84%
  • 脱欧后首次英欧峰会召开前夕,双方却因渔业和青年流动议题僵住了
  • 家庭医生可提前5天预约三甲医院号源,上海常住人口签约率达45%,
  • 中国田径巡回赛西安站完赛:男子跳远石雨豪夺冠,女子跳高刘肼毅折桂
  • 俄乌刚谈完美国便筹划与两国领导人通话,目的几何?