Java中常用的垃圾回收器

在Java的世界里,"垃圾回收"是一个让许多开发者即侍俯首也感到神秘的术语。垃圾回收(Garbage Collection, GC)是Java虚拟机(JVM)的一个重要部分,它帮助开发者管理内存,确保程序能有效并且安全地运行。本文将介绍Java中几种常用的垃圾回收器,以及它们的工作原理和适用场景。

1. 什么是垃圾回收?

在Java中,对象是在堆内存上分配的,当这些对象不再被任何部分的应用所引用时,这些对象就被认为是垃圾。垃圾回收器的任务就是找到这些不再被需要的对象,并释放它们占据的内存空间,以供新对象使用。

2. 为什么需要垃圾回收?

无法控制内存是许多程序可能遇到的问题。例如,内存泄漏,这通常发生在程序不再需要的数据没有被及时清理的情况下,长此以往可能导致内存耗尽,最终程序崩溃。通过自动垃圾回收,Java试图避免这种情况。

3. 垃圾回收器的种类

3.1 Serial GC

Serial GC是最基本的垃圾回收器,适用于单核处理器的环境。它在进行垃圾回收时会暂停所有的应用线程("Stop-The-World"事件),这通常不适用于多线程的服务器环境,但可能适合于简单的命令行程序。

使用参数:

-XX:+UseSerialGC

3.2 Parallel GC

Parallel GC又称为Throughput Collector,它使用多个线程来执行垃圾回收,因此它比Serial GC更适合多核心服务器环境。其主要关注点是提高吞吐量,缺点是在垃圾回收时仍然会有应用线程暂停。

使用参数:

-XX:+UseParallelGC

3.3 CMS GC

CMS GC(Concurrent Mark Sweep )的目标是减少因垃圾回收导致的停顿时间。它在回收内存的同时允许应用程序线程继续执行,适合于交互性强的应用,其中快速响应比吞吐量更重要。

使用参数:

-XX:+UseConcMarkSweepGC

3.4 G1 GC

G1 GC (Garbage-First)是一种服务器端垃圾回收器,它旨在填补Parallel GC和CMS GC之间的空白,提供一个低延迟的垃圾回收解决方案。G1将堆内存分成多个不同的区域,并根据每个区域可能包含垃圾的大小来确定回收的优先顺序。

使用参数:

-XX:+UseG1GC

3.5 Z GC

ZGC是一种低延迟的垃圾回收器,目前仍在积极开发中。ZGC的设计初衷是为了在大堆内存上工作,并且几乎不产生延迟。这使得它非常适合需要快速响应但是内存占用大的应用程序。

使用参数:

-XX:+UseZGC

3.6 Shenandoah GC

Shenandoah GC与ZGC有类似的目标:减少停顿时间,即便是在大堆或者多核心处理器的情况下。Shenandoah通过在GC的许多阶段与应用线程并发执行来实现这一目标。

使用参数:

-XX:+UseShenandoahGC

4. 怎样选择合适的垃圾回收器?

在选择垃圾回收器时,需要考虑应用程序的需求:

  • 对于需要最大吞吐量的应用程序,Parallel GC可能是最好的选择。
  • 如果应用需要较短的响应时间或者较少的停顿时间,可以考虑CMS或G1。
  • 对于需要极低停顿时间并且具有大内存容量的应用,ZGC或者Shenandoah可能是合适的选择。
  • 在实际中,最好的方法是通过实际的性能测试来确定最适合你的应用的垃圾回收器。

5. JDK 8 默认垃圾回收器 Parallel

JDK 8(Java Development Kit 8)中默认的垃圾回收器组合为Parallel Scavenge(用于Young Generation)加上Parallel Old(用于Old Generation)。Parallel GC 在 JDK 5 中开始成为默认的垃圾回收器。

Parallel Scavenge收集器是一个新生代垃圾收集器,它使用复制算法,而且是并行的多线程收集器。它主要关注于达到一个可控制的吞吐量(Throughput)。所谓吞吐量,就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即:吞吐量 = 用户代码时间 /(用户代码时间 + 垃圾收集时间)。服务器环境中,这种收集器能够最大化的利用CPU时间,尽快地完成程序的运算任务,特别适用于多核服务器。

Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多线程和"标记-整理"算法。这个收集器是在JDK 6u14版之后引入的。从JDK 9 开始默认垃圾回收器是 G1 (Garbage-First)

6.为何CMS不能作为默认垃圾回收器

CMS(Concurrent Mark-Sweep)收集器是一个以获取最短回收停顿时间为目标的收集器,使用"标记-清除"算法,并且是并发的。但是在JDK版本的迭代中没有任何一个版本使用CMS为一个默认的垃圾回收器

选择Parallel Scavenge和Parallel Old的原因而不用CMS,通常基于以下考虑:

  • 吞吐量优先: 如果应用不是非常注重服务响应时间,而是更希望在单位时间内完成更多的工作,即追求较高的吞吐量,那么Parallel Scavenge加上Parallel Old垃圾收集器会是一个更合适的选择。

  • 碎片化问题:CMS使用的"标记-清除"算法容易导致内存碎片化,当碎片化严重到一定程度,CMS需要进行一次完全停顿的垃圾收集以整理内存碎片(Full GC),这可能导致较长时间的停顿。而Parallel Old使用的"标记-整理"算法可以有效避免内存碎片化问题。

  • 更简单稳定: 相较于CMS,Parallel Scavenge和Parallel Old通常来说维护起来比较简单,参数配置也更容易。而CMS有几百个参数需要配置调整,对于维护的成本是非常高的。

随着Java 9的发布,G1(Garbage-First)垃圾收集器成为了默认的垃圾收集器,它旨在替代CMS,提供更好的性能表现和更简单的调优选项。而在Java 11之后,还引入了ZGC和Shenandoah等实验性的低停顿时间垃圾收集器。

7. CMS和G1比较

CMS(Concurrent Mark Sweep)和G1(Garbage-First)是Java虚拟机中的两种不同的垃圾回收器,它们各自有不同的特点和适用场景。

7. 1 CMS垃圾回收流程

  • 初始标记(Initial Mark):标记所有与GC Roots直接相连的对象,这个阶段需要停顿线程,但是时间很短。
  • 并发标记(Concurrent Mark):在整个堆中进行可达性分析,查找所有可达对象,这个阶段和应用线程并发执行,不需要停顿
  • 预清理(Preclean):进行一些预清理工作,减少最终标记时的工作量。
  • 最终标记(Remark):完成剩余的标记工作,为了减少停顿时间,通常使用多种优化算法,比如增量更新、卡表等,这个阶段需要短暂停顿
  • 并发清除(Concurrent Sweep):清除不再使用的对象,回收空间,这个阶段和应用线程并发执行。
  • 并发重置(Concurrent Reset):重置CMS算法相关的内部数据结构,为下一次GC循环做准备。

7. 2 G1垃圾回收流程

  • 初始标记(Initial Mark):这个阶段与CMS的初始标记类似,标记所有从GC Roots直接可达的对象,需要短暂停顿
  • 根区域扫描(Root Region Scanning):扫描由Survivor区域到Old区域的引用。
  • 并发标记(Concurrent Mark):进行标记阶段,计算各个区域的存活对象,这个过程是和应用程序并发的。
  • 最终标记(Remark):完成标记过程,通常使用SATB(Snapshot-At-The-Beginning)算法来减少标记过程的时间。
  • 筛选回收(Evacuation):根据之前的标记结果,选择价值最大的若干个Region进行回收。这个阶段需要停顿,但是只清理有限的区域。

G1收集器是为了替代CMS收集器而设计的,提供更可预测的垃圾回收暂停时间,特别是在处理大内存容量的多处理器机器时。G1能够更好地控制停顿时间,通过将堆分割成多个区域(Region)来避免整个堆的垃圾回收,逐步地清理内存,特别适合大堆内存的应用。

7. 3 两者比较

  • 停顿时间控制:G1具有更好的停顿时间控制能力,可以为应用程序设置停顿时间目标。
  • 内存占用:G1通常比CMS需要更多的内存空间,因为它需要维护更多的内存结构。
  • 预测性能:G1可以更准确地预测垃圾收集的停顿时间,因为它是基于区域的回收。
  • 适用场景:CMS适用于对响应时间比较敏感的应用。而G1适用于堆内存较大的场景,特别是超过4GB的堆内存。

随着Java虚拟机的发展,G1由于其更好的可预测性和适应性,越来越多地成为默认的垃圾收集器,尤其是在Java 9及以后的版本中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/201306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试题:公司规定所有接口都用 post 请求,这是为什么?

文章目录 前言get 与 post 的区别所有接口都用 post 请求?网友程墨 Morgan网友苏莉安网友大宽宽 前言 最近在逛知乎的时候发现一个有趣的问题:公司规定所有接口都用 post 请求,这是为什么? 看到这个问题的时候其实我也挺有感触的…

可编程电子负载的应用前景如何

可编程电子负载是一种模拟真实负载的电子设备,它可以模拟各种不同类型和规格的负载,如电阻、电容、电感等。通过可编程的方式,用户可以根据需要灵活地调整负载的大小、电压、电流等参数,以满足不同的测试需求。随着科技的不断发展…

pod容器内无法访问集群外部主机ipv6地址

一、背景 同事反馈他这边有一环境出现pod容器内无法请求集群外部主机ipv6地址,但是在pod所在集群所主机上是可以请求到外部主机ipv6地址。 二、问题处理过程 首先主机和主机之间ipv6地址能通讯,说明主机之间网络是没啥问题,哪问题就出在容器…

微信小程序已经审核通过但是提示订单中心path不通过

设置-基本设置-服务内容声明 更改path重新审核即可

history路由解决刷新出现404的问题

本文具体重点介绍怎么解决浏览器路由(history模式)解决404的问题。 在项目打包上线时,如果采用的是哈希模式,不会出现404,原因是 url 中 # 号后面的内容不会发给后端当作资源路径请求服务器。 具体流程(哈…

ABCDE类网络的划分及保留网段

根据IP地址的分类,IP地址被分为A、B、C、D和E五类。下面是对ABCDE类网络的划分及保留网段的详细描述: A类网络:范围从1.0.0.0到127.0.0.0,网络地址的最高位必须是“0”,可用的A类网络有127个,每个网络能容…

【算法提升—力扣每日一刷】五日总结【11/30-12/04】

2023/11/30 力扣每日一刷:1.两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元…

TCP协议实现一对一聊天

服务端代码: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner;/*** 发送消息线程*/ class Send e…

【Linux】tar、zip与rar

前言 我解压过无数的文件,却唯独无法解压自己。 tar tar是一个常用的文件打包和归档工具,它在Linux系统中被广泛使用。它的名称"tar"代表"tape archive"(磁带归档),最初用于将多个文件和目录打…

JVM的知识点

### 1. JVM基础知识 - **JVM结构:** 详细介绍JVM内部结构,包括类加载器、运行时数据区域(堆、栈、方法区/元空间)、执行引擎和本地接口等组成部分的功能和作用。 - **类加载器:** 深入了解类加载器的层次结构和加载过…

linux无法打开M4a格式音频的解决方法

linux是开源系统,之所以打不开,是因为部分linux系统为了避免版权问题,没有m4a的解码插件。所以,解决的办法是安装如下两个非常小的转换器,我们一般用不到转换器的功能,而是反向应用,通过两个几十…

『亚马逊云科技产品测评』活动征文|基于亚马逊EC2云服务器安装Bolo开源博客

授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器(Elastic Compute Cloud)是亚马…

shell脚本实战之mysql-物理备份实现周内备份策略

一.shell脚本要求 # 数据库备份脚本方式: 物理备份# 工具:xtrabackup过程# 需求1:不允许有任何的安在脚本中,# 需求2:在脚本中,不允许有任何的交互式代码容,使用日志记录# 需求3:在脚本中,不允许有任何输出# 需求4:每周为一个循环…

TA-Lib学习研究笔记(九)——Pattern Recognition (6)

TA-Lib学习研究笔记(九)——Pattern Recognition (6) 最全面的形态识别的函数的应用,通过使用A股实际的数据,验证形态识别函数,用K线显示出现标志的形态走势,由于入口参数基本上是o…

百度/抖音/小红书/微信搜索品牌形象优化怎么做?

搜索口碑是网络营销不可或缺的一部分,企业如何做好品牌搜索口碑优化呢?小马识途营销顾问建议从以下几方面入手。 1. 通过关键字优化提高自身知名度 通过对竞争对手和目标客户的关键字进行分析,企业可以确定哪些关键字可以提高自身品牌知名度。…

当代体育科技杂志社《当代体育科技》杂志社2023年第31期目录

专家论坛 基于信息化平台的体育专业学生教学文件撰写能力培养的探索与实践 王彤;闫艾萍;龙勋;杨欢;邢欣; 1-4 运动人体科学《当代体育科技》投稿:cn7kantougao163.com 有氧舞蹈项目运动强度分析——以吉林省第十七届大学生运动会有氧舞蹈项目为例 李岱峰; 5…

IDEA Maven 配置国内源

基本步骤 分别设置下图的两个,一个是对当前项目的设置,一个是对以后创建的项目设置,这样以后就不用重新配置了。 将下面的两个勾选上 注意,两个地方,Settings 和 Settings for New Projects 的勾都要勾上。 前往 User…

PHP短信接口防刷防轰炸多重解决方案三(可正式使用)

短信接口盗刷轰炸:指的是黑客利用非法手段获取短信接口的访问权限,然后使用该接口发送大量垃圾短信给目标用户 短信验证码轰炸解决方案一(验证码类解决)-CSDN博客 短信验证码轰炸解决方案二(防止海外ip、限制ip、限制手机号次数解决)-CSDN博客 PHP短信…

SQL Sever 基础知识 - 数据筛选(1)

SQL Sever 基础知识 - 四、数据筛选 四、筛选数据第1节 DISTINCT - 去除重复值1.1 SELECT DISTINCT 子句简介1.2 SELECT DISTINCT 示例1.2.1 DISTINCT 一列示例1.2.2 DISTINCT 多列示例 1.2.3 DISTINCT 具有 null 值示例1.2.4 DISTINCT 与 GROUP BY 对比 第2节 WHERE - 过滤查询…

8_企业架构缓存中间件分布式memcached

企业架构缓存中间件分布式memcached 学习目标和内容 1、能够理解描述网站业务访问流程 2、能够理解网站业务的优化方向 3、能够描述内存缓存软件Memcached的作用 4、能够通过命令行操作Memcached 5、能够操作安装php的memcached扩展 extension 6、能够实现session存储到memcach…