首页 > 其他分享 >垃圾收集器

垃圾收集器

时间:2022-12-07 15:00:17浏览次数:34  
标签:收集 G1 标记 收集器 垃圾 CMS


垃圾收集算法是内存回收的方法论, 垃圾收集器是内存回收的具体实现。

7种作用于不同分代(新生代收集器/老年代收集器)的收集器, 如果两个收集器之间存在连线, 就说明它们可以搭配使用。

垃圾收集器_CMS

1. Serial收集器

单线程的收集器,它进行垃圾收集时, 必须暂停其他所有的工作线程, 直到它收集结束。
 

2. ParNew收集器

ParNew收集器其实就是Serial收集器的多线程版本。

3. Parallel Scavenge收集器:“吞吐量优先”收集器。

多线程收集器。

CMS等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间。停顿时间越短就越适合需要与用户交互的程序, 良好的响应速度能提升用户体验。

Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量( Throughput) 。高吞吐量则可以高效率地利用CPU时间, 尽快完成程序的运算任务, 主要适合在后台运算而不需要太多交互的任务。
 

吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值, 即吞吐量=运行用户代码时间/( 运行用户代码时间+垃圾收集时间) 。

Parallel Scavenge收集器提供了两个参数用于精确控制吞吐量, 分别是控制最大垃圾收集停顿时间的-XX: MaxGCPauseMillis参数以及直接设置吞吐量大小的-XX: GCTimeRatio参数。

4. Serial Old收集器

Serial Old是Serial收集器的老年代版本, 它同样是一个单线程收集器, 使用“标记-整理”算法。 这个收集器的主要意义也是在于给Client模式下的虚拟机使用。 如果在Server模式下, 那么它主要还有两大用途: 一种用途是在JDK 1.5以及之前的版本中与Parallel Scavenge收集器搭配使用,另一种用途就是作为CMS收集器的后备预案, 在并发收集发生ConcurrentMode Failure时使用。

5. Parallel Old收集器
Parallel Old是Parallel Scavenge收集器的老年代版本, 使用多线程和“标记-整理”算法。
 

6. CMS收集器

CMS( Concurrent Mark Sweep) 收集器是一种以获取最短回收停顿时间为目标的收集
器。CMS收集器是基于“标记—清除”算法实现。是一款面向服务端应用的垃圾收集器。

初始标记( CMS initial mark)
并发标记( CMS concurrent mark)
重新标记( CMS remark)
并发清除( CMS concurrent sweep)

缺点:

CMS收集器无法处理浮动垃圾( Floating Garbage) , 可能出现“Concurrent Mode Failure”失败而导致另一次Full GC的产生。 由于CMS并发清理阶段用户线程还在运行着, 伴随程序运行自然就还会有新的垃圾不断产生, 这一部分垃圾出现在标记过程之后, CMS无法在当次收集中处理掉它们, 只好留待下一次GC时再清理掉。 这一部分垃圾就称为“浮动垃圾”。 也是由于在垃圾收集阶段用户线程还需要运行, 那也就还需要预留有足够的内存空间给用户线程使用, 因此CMS收集器不能像其他收集器那样等到老年代几乎完全被填满了再进行收集, 需要预留一部分空间提供并发收集时的程序运作使用。可以适当调高参数-XX: CMSInitiatingOccupancyFraction的值来提高触发百分比, 以便降低内存回收次数从而获取更好的性能
 

CMS是一款基于“标记—清除”算法实现的收集器, 如果读者对前面这种算法介绍还有印象的话, 就可能想到这意味着收集结束时会有大量空间碎片产生。 空间碎片过多时, 将会给大对象分配带来很大麻烦, 往往会出现老年代还有很大空间剩余, 但是无法找到足够大的连续空间来分配当前对象, 不得不提前触发一次FullGC。 为了解决这个问题, CMS收集器提供了一个-XX: +UseCMSCompactAtFullCollection开关参数( 默认就是开启的) , 用于在CMS收集器顶不住要进行FullGC时开启内存碎片的合并整理过程, 内存整理的过程是无法并发的, 空间碎片问题没有了, 但停顿时间不得不变长。虚拟机设计者还提供了另外一个参数-XX:CMSFullGCsBeforeCompaction, 这个参数是用于设置执行多少次不压缩的Full GC后, 跟着来一次带压缩的
 

7. G1收集器

G1是一款面向服务端应用的垃圾收集器。基于“标记—整理”算法实现.并行。

降低停顿时间是G1和CMS共同的关注点, 但G1除了追求低停顿外, 还能建立可预测的停顿时间模型。

G1把内存“化整为零”。它将整个Java堆划分为多个大小相等的独立区域( Region) , 虽然还保留有新生代和老年代的概念, 但新生代和老年代不再是物理隔离的了, 它们都是一部分Region( 不需要连续) 的集合。G1收集器之所以能建立可预测的停顿时间模型, 是因为它可以有计划地避免在整个Java堆中进行全区域的垃圾收集。 G1跟踪各个Region里面的垃圾堆积的价值大小( 回收所获得的空间大小以及回收所需时间的经验值) , 在后台维护一个优先列表, 每次根据允许的收集时间, 优先回收价值最大的Region( 这也就是Garbage-First名称的来由) 。 这种使用Region划分内存空间以及有优先级的区域回收方式, 保证了G1收集器在有限的时间内可以获取尽可能高
的收集效率。

初始标记( Initial Marking)
并发标记( Concurrent Marking)
最终标记( Final Marking)
筛选回收( Live Data Counting and Evacuation)

8. 小总结

垃圾收集器_java_02

垃圾收集器_老年代_03

 

 

标签:收集,G1,标记,收集器,垃圾,CMS
From: https://blog.51cto.com/u_15905340/5919358

相关文章

  • 【深入理解java虚拟机】 - JVM垃圾回收器
    文章目录​​概述​​​​并发与并行​​​​垃圾回收器的分类​​​​7种经典的垃圾回收器​​​​垃圾回收器​​​​Serial与SerialOld回收器​​​​ParNew回收器​......
  • 【深入理解java虚拟机】 - JVM垃圾回收算法
    文章目录​​对象是否存活?​​​​引用计数法​​​​可达性分析法​​​​强、软、弱、虚​​​​finalize()​​​​垃圾收集算法​​​​分代收集理论​​​​标记—清除......
  • 垃圾短信红名单的黑色幽默:谁在泄露公民隐私
    “某某银行已从您的某某银行卡里顺利扣除2600元还贷,查询请拨打********。”“你想掌握老公(老婆)的一举一动吗?只要拨打*******,即可复制他(她)的手机卡,随时掌握其通话对象、短信......
  • 朴素贝叶斯-垃圾邮件分类
    朴素贝叶斯是贝叶斯决策理论的一部分,朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法。对于大多数的分类算法,在所有的机器学习分类算法中,朴素贝叶......
  • 还在吃垃圾食品?科学家告诉你它的危害!
    食品的健康一直是广大消费者关心的问题,那么垃圾食品到底有什么危害呢?什么又是垃圾食品呢?来自美国塔夫茨大学弗里德曼营养科学与政策学院的团队在2022年11月22日在《N......
  • 第十一期 | 你抢不到的优惠券,背后“元凶”竟是垃圾注册?
    第十一期|你抢不到的优惠券,背后“元凶”竟是垃圾注册?顶象防御云业务安全情报中心发现,某电商平台注册场景出现大批量异常注册。黑产通过批量注册获得大量平台账号,为其后......
  • 机器学习之垃圾邮件分类2
    读取defread_dataset(file_path='../data/SMSSpamCollection'):"""读取数据集:return:返回数据和标题"""withopen(file_path,encoding='utf-8')as......
  • ZGC:可扩展的低延迟JVM垃圾收集器
    2.主要概念为了理解ZGC,我们需要了解内存管理和垃圾收集器背后的基本概念和术语。2.1内存管理物理内存是我们硬件提供的RAM。操作系统(OS)为每个应用程序分配虚拟内存空间......
  • 垃圾回收机制
    什么是垃圾回收机制:  垃圾回收机制是js内置的一种管理机制它会自动分配内存和自动回收不再使用的内存  垃圾回收机制的两种算法:引用计数法标记清除法  ......
  • 虚幻4引擎垃圾回收原理
    虚幻引擎的GC是追踪式、非实时、精确式,非渐近、增量回收(时间片)。垃圾回收算法分类:分类项目描述引用计数/追踪式GC引用计数通过额外的计数来对单个对象的引用次数进行计算,当......