Java 中常见的垃圾收集器有哪些?
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 中常见的垃圾收集器有哪些?的更多相关文章
- JVM中常见的垃圾收集器
垃圾收集机制是 Java 的招牌能力,极大地提高了开发效率.如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展, Java 的垃圾收集机制仍然在不断的演进中,不同大小的设备.不同特征的应用 ...
- Java中常见的5种WEB服务器介绍
这篇文章主要介绍了Java中常见的5种WEB服务器介绍,它们分别是Tomcat.Resin.JBoss.WebSphere.WebLogic,需要的朋友可以参考下 Web服务器是运行及发布Web应用的 ...
- Java中常见的Exception种类
Java中常见的Exception种类 1.ClassNotFoundException 2.IOException 3.NoSuchFieldException 4.NoSuchMethodExce ...
- JAVA中GridBagLayout布局管理器应用详解
很多情况下,我们已经不需要通过编写代码来实现一个应用程序的图形界面,而是通过强大的IDE工具通过拖拽辅以简单的事件处理代码即可很轻松的完成.但是我们不得不面对这样操作存在的一些问题,有时候我们希望能够 ...
- Java基础-JAVA中常见的数据结构介绍
Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...
- Java中常见的注解
Java中常见的注解 1.JDK自带的注解@Override @Deprecated @Suppvisewarnings 常见第三方注解 Spring:@Autowired @Service ...
- Java中常见的异常类型
一. Java中常见的异常类 异常类 说明 ClassCastException 类型准换异常 ClassNotFoundException 未找到相应类异常 ArithmeticException ...
- Java 中常见的 final 类
Java 中常见的 final 类 java.lang 包 public final class Boolean extends Object implements Serializable, Com ...
- 《深入理解 Java 虚拟机》学习 -- 垃圾收集器
<深入理解 Java 虚拟机>学习 -- 垃圾收集器 1. Serial 收集器(新生代) 含义: 单线程收集器. 缺点: 进行垃圾收集时,必须暂停其他所有的工作线程. 优点: 简单而高效 ...
- java中常见的六种线程池详解
之前我们介绍了线程池的四种拒绝策略,了解了线程池参数的含义,那么今天我们来聊聊Java 中常见的几种线程池,以及在jdk7 加入的 ForkJoin 新型线程池 首先我们列出Java 中的六种线程池如 ...
随机推荐
- Centos 7 单用户模式修改密码/配置
1.启动系统,启动项界面显示时,按"↑↓"键停留在此界面,按下"e"键进入编辑模式 2.利用"↑↓"键找到"linux16&quo ...
- 基于生成式AI的访问控制, 迁移传统安全策略到基于LLM的风险分类器
基于规则的风险分类 风险分类是网络安全系统的核心能力之一,它将访问请求和命令映射到其风险级别/类别:高(High).中(Medium).低(Low).目前,即便是在大规模环境中,风险分类器仍主要采用基 ...
- 2024 MWC上海,“翼”彩纷呈!
2024年6月26日,2024世界移动通信大会上海(简称"MWC上海")盛大开幕.围绕"未来先行"主题,来自全球的产业.技术和社区等各界代表齐聚一堂,共话产业高 ...
- Atcoder ABC387F Count Arrays 题解 [ 绿 ] [ 基环树 ] [ 树形 dp ] [ 前缀和优化 ]
Count Arrays:一眼秒的计数题. 思路 显然,把小于等于的条件化为大的向小的连单向边,每个数的入度都是 \(1\),就会形成一个基环树森林. 那么考虑这个环上能填什么数.因为所有数都小于等于 ...
- jenkins的admin用户的初始密码路径
以下命令查看即可
- sprintf用法详解
sprintf 将字串格式化. 在头文件 #include< stdio.h >中 语法: int sprintf(string format, mixed [args]...); 返回值 ...
- ABC391E题解
大概评级:绿. 题目传送门. 显然动态规划,设 \(f_{i,k}\) 表示经过 \(i\) 次变换后能将 \(a_k\) 取反的最大值,显然答案为 \(f_{n,1}\),状态转移很简单,枚举 \( ...
- rust学习笔记(4)
流程控制 if if n < 0 { print!("{} is negative", n); } else if n > 0 { print!("{} is ...
- 微信小程序云函数
小程序开发云环境设置 注意事项 每一个云函数都是一个独立的 nodeJS 项目.所以每个云函数下都有 package.json 文件 错误 前端操作数据库 1 指引 2 新建集合 3 新增记录 4 查 ...
- VMware ESXi系统
esxi全称"VMware ESXi",是可直接安装在物理服务器上的强大的裸机管理系统,是一款虚拟软件,不需安装其他操作系统,是VMware服务器虚拟化的基础.通过直接访问并控制底 ...