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

Java 垃圾收集机制

垃圾收集的基本概念

垃圾收集(Garbage Collection, GC) 是 JVM 自动管理内存的机制,负责回收不再使用的对象所占用的内存。

关键概念

  • 垃圾对象:不再被任何引用指向的对象

  • GC Roots:始终可达的对象,作为引用链的起点

  • Stop-the-World:GC 执行时暂停所有应用线程

内存分代模型

JVM 将堆内存分为三个主要区域:

1. 年轻代 (Young Generation)

  • Eden区:新创建的对象首先分配在这里

  • Survivor区 (S0, S1):经历 Minor GC 后存活的对象在这里交换

2. 老年代 (Old Generation)

  • 长期存活的对象最终会晋升到这里

  • 需要 Major GC/Full GC 来清理

3. 元空间 (Metaspace) - JDK 8+

  • 存储类元数据、方法信息等

  • 替代了之前的永久代 (PermGen)

垃圾收集算法

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

// 概念性代码
public class MarkSweep {public void garbageCollect() {// 阶段1: 标记 - 找出所有存活对象
        markFromRoots();// 阶段2: 清除 - 回收未标记对象的内存
        sweep();}private void markFromRoots() {// 从GC Roots开始遍历所有可达对象并标记
    }private void sweep() {// 遍历堆内存,回收未标记对象
    }
}

2. 复制算法 (Copying)

  • 将内存分为两块,只使用其中一块。GC 时将存活对象复制到另一块,然后清空当前块。

  • 用于年轻代的 Survivor 区。

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

  • 先标记所有存活对象。然后将存活对象向一端移动,清理边界以外的内存。

  • 用于老年代。

主要的垃圾收集器

1. Serial GC

  • 单线程收集器。适合客户端应用、小内存场景

 

-XX:+UseSerialGC

 

2. Parallel GC (吞吐量优先)

  • 多线程并行收集。JDK 8 默认收集器

-XX:+UseParallelGC

3. CMS (Concurrent Mark Sweep)

  • 尽量减少停顿时间。与应用程序并发执行

-XX:+UseConcMarkSweepGC

4. G1 (Garbage First) - JDK 9+ 默认

// G1 的堆内存布局
public class G1Layout {// 将堆划分为多个等大小的Region (1MB-32MB)// 不再固定分代大小,动态分配// 优先回收垃圾最多的Region (Garbage First)
}

5. ZGC (低延迟)

  • 目标:停顿时间不超过10ms。支持TB级别堆内存

-XX:+UseZGC

6. Shenandoah

  • 类似ZGC的低延迟收集器。与应用程序并发执行

-XX:+UseShenandoahGC

GC 触发时机

1. Minor GC

  • 当Eden区满时触发。只收集年轻代。频率高,停顿时间短

2. Major GC / Full GC

  • 当老年代满时触发。收集整个堆(年轻代 + 老年代)。频率低,停顿时间长

对象生命周期

public class ObjectLifecycle {public void demonstrate() {// 1. 对象在Eden区创建Object obj1 = new Object();// 2. 经历Minor GC后,如果存活则进入Survivor区// 每经历一次Minor GC,年龄+1// 3. 当年龄达到阈值(默认15),晋升到老年代for (int i = 0; i < 15; i++) {System.gc(); // 模拟多次GC
        }// 4. 最终在Full GC时被回收(如果没有引用)obj1 = null; // 使对象成为垃圾System.gc(); // 建议JVM执行GC
    }
}

常见的 GC 调优参数

# 设置堆大小
-Xms512m -Xmx2g# 设置年轻代大小
-XX:NewRatio=2           # 老年代:年轻代 = 2:1
-XX:NewSize=256m -XX:MaxNewSize=512m# 设置Survivor区比例
-XX:SurvivorRatio=8      # Eden:Survivor = 8:1:1# 选择GC算法
-XX:+UseG1GC
-XX:+UseParallelGC
-XX:+UseZGC# GC日志配置
-Xlog:gc*:file=gc.log:time,uptime,level,tags
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps

最佳实践

  1. 及时释放引用:对象不再使用时设为null

  2. 避免大对象:大对象直接进入老年代

  3. 合理使用集合:及时清理不再需要的集合数据

  4. 使用局部变量:方法结束后自动释放

  5. 谨慎使用静态集合:容易导致内存泄漏

监控工具

  • jstat:监控GC统计信息

  • jmap:堆内存分析

  • VisualVM:图形化监控

  • GC日志:分析GC行为和性能

http://www.jsqmd.com/news/41966/

相关文章:

  • Metasploit Framework 6.4.99 (macOS, Linux, Windows) - 开源渗透测试框架
  • 小程序获取OCR识别结果,示例代码
  • 20232405 2024-2025-1 《网络与系统攻防技术》实验五实验报告
  • Invicti v25.11 发布,新增功能简介
  • Acunetix v25.11 发布,新增功能简介
  • 【运维自动化-标准运维】变量的高级用法
  • MySQL数据过滤与计算字段实战技术指南
  • 2025-11-14 PQ v.Next日志记录
  • 详细介绍:K8s 安全机制全解析
  • 详细介绍:MySQL索引指南
  • 实用指南:【第五章:计算机视觉-项目实战之推荐/广告系统】1.推荐系统基础与召回算法-(6)召回算法之u2i: FM、deepFM、召回双塔原理精讲与实战
  • 微前端架构演进:决策、实践与协同
  • OI 技术动作 注意事项集合
  • Java 设计模式—— 责任链模式:从原理到 SpringBoot 最优搭建
  • 大模型基础补全计划(七)---Transformer(多头注意力、自注意力、位置编码)及实例与测试
  • 京东商品详情接口终极突破:从多接口联动解析到数据全息重构
  • 实用指南:On-Page SEO完全指南:从关键词策略到内容优化
  • 2025年品质卓越的羊毛地毯品牌综合推荐与选购指南
  • dfad
  • 2025年品质卓越的羊毛地毯工厂综合推荐与选择指南
  • 20232415 2025-2026-1 《网络与系统攻防技术》 实验五实验报告
  • CSP2025反思——于诗涵
  • 接雨水算法全解析:从错误到3种最优解法(含扩展与思路Trigger)
  • 详细介绍:Android APK签名机制的工作原理、结构差异、安全局限与优势
  • Java位运算符概览
  • C#性能优化基础:高CPU使用率(trace)
  • 详细介绍:Linux Bash(一)
  • 做一个简单的贪吃蛇游戏
  • pytest测试range内置函数
  • WPS---功能设置