JVM垃圾回收器的选择

在java中,垃圾回收(gc)是重要的过程,用于管理内存,回收不被使用的对象,垃圾回收主要针对的是内存结构中的堆内存进行回收,内存结构和回收算法请参考java内存结构及垃圾回收算法介绍

垃圾回收器的介绍 

垃圾回收器优点缺点针对特性常见组合方式
Serial简单高效单线程导致停顿较长新生代单线程,使用标记-复制算法,适合客户端模式Serial(新生代) + Serial Old(老年代)
ParNew多线程,与CMS配合效果较好停顿较长,可能影响服务质量新生代多线程,使用标记-复制算法,CMS的新生代替代者,可与CMS搭配ParNew(新生代) + CMS(老年代)
Parallel多线程,适合高吞吐量停顿较长,可能影响服务质量新生代多线程,并行垃圾收集,吞吐量优先Parallel Scavenge(新生代) + Serial Old(老年代)
CMS并发收集,短暂停顿,适合响应敏感应用内存碎片,吞吐量相对较低老年代并发收集,标记-清除算法,减少停顿时间ParNew(新生代) + CMS(老年代)
G1并发收集,短暂停顿,高吞吐量初始标记和最终标记阶段的停顿较长新生代和老年代区域任意收集,基于标记-整理算法,根据堆内存划分为多个区域,按照区域优先级执行垃圾回收,适用于大堆内存场景G1(新生代和老年代)
ZGC极短暂停时间,适用于超大堆内存相比G1的吞吐量略低新生代和老年代并发收集,标记-整理算法,目标是将停顿时间限制在10ms以内,适用于大堆内存场景ZGC(新生代和老年代)

吞吐量 

吞吐量是处理器用于运行用户代码的时间与处理器总消耗时间的比值。Parallel Scavenge收集器的目标是达到一个可控制的吞吐量,即最大限度地提高虚拟机的运算能力

Serial收集器

Serial收集器是java虚拟机最早的新生代收集器,它采用单线程工作方式,也叫"串行垃圾回收器"

Serial GC 是一种基于标记-复制算法的垃圾回收器。

它通过暂停应用程序的所有线程来执行垃圾回收操作,因此也被称为“Stop-The-World”垃圾回收器

在垃圾回收过程中,Serial GC 使用单个线程来扫描和回收堆内存中的对象,这样可以简化实现并减少系统开销,但也导致了较长的停顿时间。由于其简单性和低系统开销,Serial GC 通常适用于小型应用和开发环境。

 Parallel 收集器

Parallel GC 是 Serial GC 的并行版本,它利用多个线程来并行执行垃圾回收操作,以提高回收效率。Parallel GC 适用于多核处理器和需要高吞吐量的大型应用场景,那些后台运算而不需要太多与用户交互的任务与 Serial GC 类似,Parallel GC 也使用“Stop-The-World”机制进行垃圾回收,因此会造成较长的停顿时间

ParNew 收集器

ParNew收集器是HotSpot虚拟机中的新生代垃圾收集器,它是Serial收集器的多线程并行版本

与CMS收集器配合

ParNew收集器常与CMS收集器(Concurrent Mark-Sweep)搭配使用。ParNew负责新生代的垃圾收集,而CMS负责老年代的并发收集。这种搭配在特定场景下能够提供较好的垃圾收集性能和较低的停顿时间

更先进的垃圾收集器如G1(Garbage First)的出现,逐渐取代了ParNew收集器。G1收集器是一种面向全堆的垃圾收集器,不需要其他新生代收集器的配合。从JDK 9开始,ParNew收集器和CMS收集器已经不再是官方推荐的垃圾收集器解决方案

CMS收集器

CMS收集器是一种旨在最小化垃圾回收停顿时间的Java垃圾收集器。它适用于对服务端应用程序的响应时间要求较高的场景,特别是那些运行在互联网网站或基于浏览器的B/S系统的服务端,采用标记-清除算法进行老年代垃圾回收,弊端就是产生内存碎片

CMS收集器的优点 

耗时最长的并发标记和并发清除阶段垃圾收集器线程可以与用户线程一起工作,使得CMS收集器的内存回收过程与用户线程并发执行,从而降低停顿时间

CMS收集器的缺点 

  • 对处理器资源敏感CMS收集器占用一部分线程(或处理器计算能力),这可能导致应用程序的总吞吐量下降,特别是在处理器核心数较少的情况下
  • 无法处理浮动垃圾由于并发标记和清除期间仍会有新的垃圾对象产生,这些垃圾对象无法在当前收集中处理,而必须留待下一次垃圾收集时再清理,称为"浮动垃圾"。这可能导致"Concurrent Mode Failure"失败,并触发另一次完全"Stop The World"的Full GC
  • 空间碎片问题:CMS收集器使用标记-清除算法,回收结束时会产生大量空间碎片。这可能导致大对象分配困难,而不得不提前触发一次Full GC

为了解决这些问题,CMS收集器提供了一些参数进行配置,例如可以调整触发垃圾收集的阈值、启用内存碎片的合并整理过程等。然而,尽管CMS收集器在过去是一款优秀的选择,但自从JDK 9开始,它已被标记为废弃

G1收集器

G1收集器是Java垃圾收集器技术的重要进展,它开创了面向局部收集的设计思路和基于Region的内存布局形式。G1的目标是实现可预测的停顿时间模型,使其成为一款适用于服务端应用的垃圾收集器

G1收集器的特点

基于Region的内存布局:G1将Java堆划分为多个大小相等的Region,每个Region可以扮演不同角色,如Eden空间、Survivor空间或老年代空间。这种动态划分使得G1能够更灵活地处理不同区域的垃圾回收。

局部收集:G1跳出了传统分代收集的范畴,它可以面向Java堆内存的任意部分进行局部回收,根据Region中垃圾的数量和收集效益来优先处理垃圾回收,实现了"Garbage First"的原则。

大对象处理G1引入了Humongous区域来存储大对象,大于一个Region容量一半的对象被视为大对象。超大对象则存放在连续的Humongous Region中,这些区域被视为老年代的一部分。

可预测的停顿时间:G1收集器通过维护Region的回收价值和优先级列表,根据用户设定的停顿时间目标(参数-XX:MaxGCPauseMillis)来优先回收收益最大的Region

 ZGC收集器

C(Z Garbage Collector)是一款低延迟的垃圾收集器,于JDK 11中引入,由Oracle公司开发。它的目标是实现极低的停顿时间,尽量减少垃圾收集对应用程序的影响,从而满足那些对低延迟和高响应性有要求的Java应用程序

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

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

相关文章

在iPhone上恢复已删除的Safari历史记录的最佳方法

您是否正在寻找恢复 iPhone 上已删除的 Safari 历史记录的最佳方法?好吧,这篇文章提供了 4 种在有/无备份的情况下恢复 iPhone 上已删除的 Safari 历史记录的最佳方法。现在按照分步指南进行操作。 iPhone 上的 Safari 历史记录会被永久删除吗&#xff1…

kafka 发送文件二进制流及使用header发送附属信息

文章目录 背景案例发送方接收方 背景 需要使用kafka发送文件二进制以及附属信息 案例 发送方 import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerRecord;import java.io.InputStream; import java.nio.charset.S…

Halo DB 魔法之 pg_pcpu_limit

↑ 关注「少安事务所」公众号,欢迎⭐收藏,不错过精彩内容~ 前情回顾 前面已经介绍了“光环”数据库的基本情况和安装办法,今天来介绍一个新话题。 哈喽,国产数据库!Halo DB! 三步走,Halo DB 安装指引 ★ Ha…

Java Agent利器

一、JavaAgent技术 1.1 什么是JavaAgent JavaAgent是一种特殊的Java程序,是Instrumentation的客户端。它与普通Java程序通过main方法启动不同,JavaAgent并不是一个可以单独启动的程序,它必须依附在一个Java应用程序(JVM&#xf…

java并发常见问题

1.死锁:当两个或多个线程无限期地等待对方释放锁时发生死锁。为了避免这种情况,你应该尽量减少锁定资源的时间,按顺序获取锁,并使用定时锁尝试。 2.竞态条件:当程序的行为依赖于线程的执行顺序或输入数据到达的顺序时…

Lagrange ZK Coprocessor:革新区块链领域的大数据应用

1. 引言 2024年5月11日,Lagrange Labs宣称获得由Founders Fund领投(Archetype Ventures, 1kx, Maven11, Fenbushi Capital, Volt Capital, CMT Digital, Mantle Ecosystem Fund和其它天使投资人跟头)的1320万美金种子轮融资,致力于…

springboot高校网上选课系统-计算机毕业设计源码85583

摘 要 本论文主要论述了如何使用JAVA语言开发一个高校网上选课系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述高校网上选课系统的当前背景以及系统开发的目…

typescript --object对象类型

ts中的object const obj new Object()Object 这里的Object是Object类型,而不是JavaScript内置的Object构造函数。 这里的Object是一种类型,而Object()构造函数表示一个值。 Object()构造函数的ts代码 interface ObjectConstructor{readonly prototyp…

实验报告6-SSM框架整合

资料下载链接 实验报告6-SSM框架整合(1验证码) 实验报告6-SSM框架整合(2管理员登录) 实验报告6-SSM框架整合(3商品的分页查询) 实验报告6-SSM框架整合(4权限拦截器) 一、需求分析 使用普通整合方式实现SSM(SpringMVC、Spring和MyBatis)整合,…

C++20 范围(Range):简化集合操作

C20 范围:简化集合操作 一、范围(Range)的目的二、在模板函数中使用范围概念三、投影四、视图五、结论 一、范围(Range)的目的 在 C20 中,范围概念要求一个对象同时拥有迭代器和结束哨兵。这在标准集合的上…

YOLOv5改进(五)-- 轻量化模型MobileNetv3

文章目录 1、MobileNetV3论文2、代码实现2.1、MobileNetV3-small2.2、MobileNetV3-large 3、运行效果4、目标检测系列文章 1、MobileNetV3论文 Searching for MobileNetV3论文 MobileNetV3代码 MobileNetV3 是 Google 提出的一种轻量级神经网络结构,旨在在移动设备上…

官网上线,一款令人惊艳的文本转语音模型:ChatTTS

近日,一个名为 ChatTTS 文本转语音模型的项目在github上横空出世,一经推出便引发极大关注,短短四天时间,已经狂揽了14.2k的Start量。 ChatTTS是一款专为对话场景设计的支持中英文的文本转语音(TTS)模型&…

Codeforces Global Round 17 C. Keshi Is Throwing a Party 题解 二分答案

Keshi Is Throwing a Party 题目描述 Keshi is throwing a party and he wants everybody in the party to be happy. He has n n n friends. His i i i-th friend has i i i dollars. If you invite the i i i-th friend to the party, he will be happy only if at m…

未来已来:Spring Boot引领数据库智能化革命

深入探讨了Spring Boot如何与现代数据库技术相结合,预测并塑造未来的数据访问趋势。本书不仅涵盖了Spring Data JPA的使用技巧,还介绍了云原生数据库的概念,微服务架构下的数据访问策略,以及AI在数据访问层的创新应用。旨在帮助开…

微信小程序如何进行页面跳转

微信小程序中的页面跳转可以通过多种方式实现,以下是几种主要的跳转方式及其详细解释: wx.navigateTo 功能:保留当前页面,跳转到应用内的某个页面。特点: 可以在新页面使用wx.navigateBack返回原页面。每跳转一个新页…

XFeat:速度精度远超superpoint的轻量级图像匹配算法

代码地址:https://github.com/verlab/accelerated_features?tabreadme-ov-file 论文地址:2404.19174 (arxiv.org) XFeat (Accelerated Features)重新审视了卷积神经网络中用于检测、提取和匹配局部特征的基本设计选择。该模型满足了对适用于资源有限设备…

在table中获取每一行scope的值

目的 当前有一份如下数据需要展示在表格中&#xff0c;表格的页面元素套了一个折叠面板&#xff0c;需要循环page_elements中的数据展示出来 错误实践 将template放在了折叠面板中&#xff0c;获取到的scope是空数组 <el-table-column label"页面元素" show-o…

【并发程序设计】15.信号灯(信号量)

15.信号灯(信号量) Linux中的信号灯即信号量是一种用于进程间同步或互斥的机制&#xff0c;它主要用于控制对共享资源的访问。 在Linux系统中&#xff0c;信号灯作为一种进程间通信&#xff08;IPC&#xff09;的方式&#xff0c;与其他如管道、FIFO或共享内存等IPC方式不同&…

分析和设计算法

目录 前言 循环不变式 n位二进制整数相加问题 RAM模型 使用RAM模型分析 代码的最坏情况和平均情况分析 插入排序最坏情况分析 插入排序平均情况分析 设计算法 分治法 总结 前言 循环迭代&#xff0c;分析算法和设计算法作为算法中的三个重要的角色&#xff0c;下面…

C/C++|基于回调函数实现异步操作

首先&#xff0c;要搞懂一点&#xff0c;异步操作本质上也是并发&#xff0c;我们想要在线程级别实现异步并发基本就靠三种方式&#xff1a; 多线程并发回调函数协程 今天我们讨论的是回调函数&#xff0c;我们如何通过回调函数来实现异步操作呢&#xff1f; 非阻塞I/O操作回…