DukeDuke
主页
关于我们
主页
关于我们
  • Java

    • Java基础

      • 内存与磁盘
      • 进制转换
      • 数据存储
      • Java基本数据类型
      • HashMap
      • Java四大引用
    • JVM

      • 认识JVM
      • JVM类加载器
      • 运行时数据区
      • 执行引擎
      • 本地方法接口
      • 本地方法库
      • JVM垃圾回收
      • JVM性能监控
      • JVM调优
    • 设计模式
      • 单例模式
      • 工厂模式
      • 策略模式
      • 适配器模式
      • 建造者模式
      • 原型模式
      • 装饰器模式
      • 代理模式
      • 外观模式
      • 享元模式
      • 组合模式
      • 桥接模式
    • Java多线程

      • Java 线程基础详解
      • Java 线程池详解
      • Java ThreadLocal 详解
      • Java volatile 详解
      • Java 线程间通信详解
      • Java 线程安全详解
      • Java 线程调度详解
      • Java 线程优先级详解

      • Java 线程中断详解
      • Java 线程死锁详解
    • Java反射
    • Java 面试题

      • Java 基础概念面试题
      • Java 面向对象编程面试题
      • Java 集合框架面试题
      • Java 多线程与并发面试题
      • JVM 与内存管理面试题
      • Java I/O 与 NIO 面试题
      • Java 异常处理面试题
      • Java 反射与注解面试题
      • Java Spring 框架面试题
      • Java 数据库与 JDBC 面试题
      • Java 性能优化面试题
      • Java 实际项目经验面试题
      • Java 高级特性面试题
      • Java 面试准备建议

JVM 垃圾回收

什么是垃圾回收

垃圾回收(Garbage Collection, GC)是 Java 虚拟机(JVM)中的一个重要机制,用于自动管理和回收不再使用的内存空间。

垃圾回收的对象

JVM 中的垃圾回收主要针对堆内存中的对象实例。当一个对象不再被任何其他对象引用时,就会被标记为垃圾对象,等待被回收。

垃圾回收算法

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

  • 标记阶段:标记所有存活的对象
  • 清除阶段:回收未被标记的对象
  • 缺点:会产生内存碎片

2. 复制算法(Copying)

  • 将内存分为两块,每次只使用其中一块
  • 当这一块内存用完,将存活对象复制到另一块
  • 优点:不会产生内存碎片
  • 缺点:内存使用率低

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

  • 标记阶段:标记存活对象
  • 整理阶段:将存活对象向一端移动
  • 优点:不会产生内存碎片
  • 缺点:移动对象成本较高

4. 分代收集算法

  • 将堆内存分为新生代和老年代
  • 新生代使用复制算法
  • 老年代使用标记-清除或标记-整理算法

垃圾收集器

JVM 提供了多种垃圾收集器,适用于不同的场景:

1. Serial 收集器

  • 单线程收集器
  • 工作时需要暂停所有用户线程(Stop The World)
  • 简单高效,适用于单 CPU 环境
  • 新生代采用复制算法,老年代采用标记-整理算法

2. ParNew 收集器

  • Serial 收集器的多线程版本
  • 除了使用多线程进行垃圾收集外,其他特性与 Serial 收集器一样
  • 是 CMS 收集器的默认搭配收集器

3. Parallel Scavenge 收集器

  • 新生代收集器,使用复制算法
  • 并行多线程收集
  • 关注吞吐量(运行用户代码时间/(运行用户代码时间+垃圾收集时间))
  • 提供自适应调节策略

4. CMS(Concurrent Mark Sweep)收集器

  • 以获取最短回收停顿时间为目标
  • 基于标记-清除算法
  • 并发收集,用户线程和垃圾收集线程同时工作
  • 适用于对响应时间要求较高的应用

5. G1(Garbage First)收集器

  • 面向服务端应用的收集器
  • 可以充分利用多 CPU、多核环境
  • 将堆内存划分为多个大小相等的 Region
  • 可预测的停顿时间模型
  • JDK 9 后的默认垃圾收集器

6. ZGC 收集器

  • JDK 11 中推出的低延迟垃圾收集器
  • 基于 Region 内存布局
  • 使用了读屏障、染色指针等技术
  • 停顿时间不超过 10ms

GC 调优

常用参数

  • -Xms: 初始堆大小
  • -Xmx: 最大堆大小
  • -XX:NewRatio: 新生代和老年代的比例
  • -XX:SurvivorRatio: Eden 区和 Survivor 区的比例
  • -XX:+UseSerialGC: 使用 Serial + Serial Old 收集器
  • -XX:+UseParNewGC: 使用 ParNew + Serial Old 收集器
  • -XX:+UseParallelGC: 使用 Parallel Scavenge + Parallel Old 收集器
  • -XX:+UseConcMarkSweepGC: 使用 ParNew + CMS + Serial Old 收集器
  • -XX:+UseG1GC: 使用 G1 垃圾收集器

调优策略

  1. 选择合适的垃圾收集器
  2. 合理设置内存大小
  3. 优化代码减少对象创建
  4. 及时释放无用对象
  5. 监控 GC 日志进行分析
最近更新:: 2025/12/29 11:07
Contributors: Duke
Prev
本地方法库
Next
JVM性能监控