当前位置: 首页 > 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.xdnf.cn/news/527671.html

相关文章:

  • 猎板PCB多层层压工艺能力及流程
  • Word2Vec 模型的工作原理
  • c#基础01(.Net介绍)
  • 图漾相机错误码解析(待补充)
  • 51单片机实现流水灯
  • 大数据hadoop小文件处理方案
  • 解锁MySQL性能调优:高级SQL技巧实战指南
  • visual studio code中的插件都是怎么开发的?用的什么编程语言?
  • 深度解析3D模型生成器:基于StyleGAN3与PyTorch3D的多风格生成工具开发实战
  • stm32week16
  • PyMOL结构对齐方式
  • 我的食物信使女友
  • 操作符的详解
  • Google机器学习实践指南(训练与损失函数篇)
  • 避开封禁陷阱:动态IP在爬虫、跨境电商中的落地实践
  • 网络安全之大模型隐私攻击技术
  • 使用 OpenCV 实现 ArUco 码识别与坐标轴绘制
  • OpenCV CUDA 模块中的矩阵算术运算-----在频域中执行两个复数频谱的逐元素乘法的函数mulSpectrums()
  • 耗时十分钟,做了一个 uniapp 灵感泡泡机
  • 【QT】一个界面中嵌入其它界面(三)
  • DriveGenVLM:基于视觉-语言模型的自动驾驶真实世界视频生成
  • 系统安全及应用学习笔记
  • MySQL数据库基础 -- SQL 语句的分类,存储引擎
  • 系统安全应用
  • 【C++】map和multimap的常用接口详解
  • flask蓝图的导入与注册
  • VS2017编译librdkafka 2.1.0
  • 【语音克隆Open Voice的使用】
  • mysql的安装方式
  • 【成品设计】基于STM32的环境监控系列