当前位置: 首页 > 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收集器
http://www.dtcms.com/a/200732.html

相关文章:

  • 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 区域和检索 - 数组不可变
  • ubuntu 20.04 运行和编译LOAM_Velodyne
  • EtherCAT通讯框架
  • 导轨固定螺栓的扭矩标准是多少?
  • RAC共享存储扩容
  • win11下,启动springboot时,提示端口被占用的处理方式
  • RAG策略
  • Python读取和处理TIFF数据教程 (由简入深)
  • NumPy 2.x 完全指南【十一】N 维数组对象(ndarray)
  • 庐山派 HDMI Python 图像开发 K230图像传输方案
  • 在资源受限环境下,移动端如何实现流畅动画?如何在内存、CPU、GPU、网络等多种限制条件下,依然保持动画高帧率、低延迟、不卡顿?