Java 中常见的垃圾收集器

Java 提供了多种垃圾收集器(Garbage Collector, GC),每种收集器针对不同的应用场景和需求进行了优化。以下是常见的垃圾收集器及其特点。


1. Serial 收集器

特点

  • 单线程工作,适合单核 CPU 环境。
  • 使用 标记-复制算法(新生代)和 标记-整理算法(老年代)。
  • 优点
    • 简单高效,在小型应用中性能稳定。
  • 缺点
    • 停顿时间长(STW 明显),不适合多线程环境。

使用场景

  • 单线程程序或小型 Java 应用。

2. Parallel 收集器

特点

  • 多线程并行收集,适合多核 CPU。
  • 新生代使用 复制算法,老年代使用 标记-整理算法
  • 可通过 -XX:ParallelGCThreads 参数设置并行线程数。
  • 优点
    • 注重吞吐量(即减少 GC 总时间)。
  • 缺点
    • 对暂停时间要求较高的场景不适合。

使用场景

  • 后台处理任务,注重吞吐量的应用。

3. CMS(Concurrent Mark-Sweep)收集器

特点

  • 低延迟 为目标的收集器。
  • 使用 标记-清除算法
  • 优点
    • GC 与用户线程并发执行,降低停顿时间。
  • 缺点
    • 会产生内存碎片。
    • 对 CPU 资源敏感,并发阶段可能影响性能。

使用场景

  • 对响应时间要求高的应用,如 Web 服务。

4. G1(Garbage First)收集器

特点

  • 将堆内存划分为多个固定大小的区域(Region)。
  • 采用 分区算法,优先回收垃圾最多的区域。
  • 优点
    • 控制停顿时间,通过 -XX:MaxGCPauseMillis 设置最大停顿时间。
    • 减少全堆扫描,内存碎片少。
  • 缺点
    • 实现复杂,调优成本较高。

使用场景

  • 大型内存、多核 CPU、高实时性要求的应用。

5. ZGC(Z Garbage Collector)

特点

  • 极低延迟(停顿时间通常在 10ms 以下)。
  • 支持大堆内存(最大支持 16TB)。
  • 使用 标记-复制算法
  • 优点
    • 停顿时间与堆大小无关。
    • 高效处理大内存场景。
  • 缺点
    • CPU 开销较高。

使用场景

  • 超大内存应用,对延迟敏感的系统。

6. Shenandoah 收集器

特点

  • 目标是实现 低延迟高吞吐量 的平衡。
  • 使用并发压缩技术减少停顿时间。
  • 优点
    • 停顿时间更低(与 G1 相比)。
  • 缺点
    • 适配性不如 G1。

使用场景

  • 需要更低停顿时间的高性能系统。

7. 总结

收集器 算法 目标 优点 缺点 适用场景
Serial 标记-复制/标记-整理 高吞吐量 简单稳定 单线程,停顿时间长 单线程、小型应用
Parallel 标记-复制/标记-整理 高吞吐量 并行收集,性能高 停顿时间较长 多线程任务,注重吞吐量
CMS 标记-清除 低延迟 并发执行,响应时间快 内存碎片,CPU 开销大 响应时间敏感的服务
G1 分区算法 低停顿 控制停顿时间,减少碎片 调优复杂 大内存、高实时性应用
ZGC 标记-复制 极低延迟 停顿时间与堆大小无关 CPU 消耗大 超大内存,低延迟系统
Shenandoah 并发标记-整理 低延迟 更低停顿时间 实现复杂,适配性较弱 低延迟高性能系统
  • 现代 Java 默认推荐使用 G1 收集器,JDK 11 开始 ZGC 和 Shenandoah 提供更优的延迟选项。

Java 中常见的垃圾收集器有哪些?的更多相关文章

  1. JVM中常见的垃圾收集器

    垃圾收集机制是 Java 的招牌能力,极大地提高了开发效率.如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展, Java 的垃圾收集机制仍然在不断的演进中,不同大小的设备.不同特征的应用 ...

  2. Java中常见的5种WEB服务器介绍

    这篇文章主要介绍了Java中常见的5种WEB服务器介绍,它们分别是Tomcat.Resin.JBoss.WebSphere.WebLogic,需要的朋友可以参考下 Web服务器是运行及发布Web应用的 ...

  3. Java中常见的Exception种类

    Java中常见的Exception种类 1.ClassNotFoundException 2.IOException 3.NoSuchFieldException 4.NoSuchMethodExce ...

  4. JAVA中GridBagLayout布局管理器应用详解

    很多情况下,我们已经不需要通过编写代码来实现一个应用程序的图形界面,而是通过强大的IDE工具通过拖拽辅以简单的事件处理代码即可很轻松的完成.但是我们不得不面对这样操作存在的一些问题,有时候我们希望能够 ...

  5. Java基础-JAVA中常见的数据结构介绍

    Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...

  6. Java中常见的注解

    Java中常见的注解 1.JDK自带的注解@Override  @Deprecated  @Suppvisewarnings 常见第三方注解 Spring:@Autowired  @Service  ...

  7. Java中常见的异常类型

    一. Java中常见的异常类 异常类 说明 ClassCastException 类型准换异常 ClassNotFoundException 未找到相应类异常 ArithmeticException ...

  8. Java 中常见的 final 类

    Java 中常见的 final 类 java.lang 包 public final class Boolean extends Object implements Serializable, Com ...

  9. 《深入理解 Java 虚拟机》学习 -- 垃圾收集器

    <深入理解 Java 虚拟机>学习 -- 垃圾收集器 1. Serial 收集器(新生代) 含义: 单线程收集器. 缺点: 进行垃圾收集时,必须暂停其他所有的工作线程. 优点: 简单而高效 ...

  10. java中常见的六种线程池详解

    之前我们介绍了线程池的四种拒绝策略,了解了线程池参数的含义,那么今天我们来聊聊Java 中常见的几种线程池,以及在jdk7 加入的 ForkJoin 新型线程池 首先我们列出Java 中的六种线程池如 ...

随机推荐

  1. angularjs和ajax的结合使用 (四)

    知道的朋友了解 我不是属于讲按部就班技术的那种人.什么xx入门 ,入门到精通,入门到入土. 其实非要严格说的话已经跟angularjs 什么ajax 偏的有点远了,之所以还是叫这个名称,因为都属于we ...

  2. 手把手教你编写自定义Categraf插件

    本文分享自天翼云开发者社区<手把手教你编写自定义Categraf插件>,作者:任****佳 Categraf 是一个监控采集 Agent,类似 Telegraf.Grafana-Agent ...

  3. nacos(一): 下载、运行与鉴权配置

    1.下载 nacao的官网地址是https://nacos.io/ 当前稳定版本是2.5.0,可以在官网下载,也可以在github上下载.其中,官网提供的下载地址是: https://download ...

  4. shell脚本获取本机ip地址

    IP=`ifconfig|grep -v '127.0.0.1'|grep -v 'inet6'|grep 'inet'|awk '{print $2}'|awk 'NR==1'|egrep -o ' ...

  5. Java SPI机制及实现

    一.简介 SPI 的全称为 (Service Provider Interface),是 JDK 内置的一种服务提供发现机制.主要由工具类 java.util.ServiceLoader 提供相应的支 ...

  6. 几乎全平台的C语言JSON解析工具cJSON[转载]

    最近在做一个外设管理平台,用PYTHON写了一个连接管理,兼容串口和套接字的连接,然后抽象为设备统一管理.使用套接字时JSON是一种很好的数据封装类型,假设我需要远程操控一个设备,发送一个JSON的数 ...

  7. docker - [05] 部署Nginx

    题记部分 一.查找镜像 docker search nginx 二.拉取镜像 docker pull nginx 三.启动镜像 Nginx默认端口号为80,可以在启动时指定Nginx使用的端口号(例如 ...

  8. 基于项目的协同过滤推荐算法(Item-Based Collaborative Filtering Recommendation Algorithms)

    前言 协同过滤推荐系统,包括基于用户的.基于项目的息肉通过率等,今天我们读一篇基于项目的协同过滤算法的论文. 今天读的论文为一篇名叫<基于项目的协同过滤推荐算法>(Item-Based C ...

  9. 【目标检测】一、初始的R-CNN与SVM

    1.流程 为什么要用SVM而不是CNN最后一层的softmax? 取什么模型必然是有标准衡量,这个流程取得是书上[4]写的,作者说他得实验证明SVM比FC的mAP要高,所以我流程暂且这样画了. R-C ...

  10. pandas如何处理跳过表头操作

    1.打印前5行数据,发现存在'NAN' 2.如果这个问题不处理,后续要到操作列时,会报错误''DataFrame' object is not callable' 思路: 跳过有NAN的行 def t ...