Java中有几种垃圾收集器
创始人
2024-12-25 15:01:56
0次

  垃圾收集器就是垃圾收集算法的具体实现。它们分别是新生代的:Serial、ParNew、ParallelScavenge老年代的:SerialOld、ParallelOld、CMS以及适用于新生代和老年代的G1。算上jdk11的ZGC目前一共是八种垃圾收集器。

Serial收集器

  Serial是最早的垃圾收集器,这是一个单线程收集器,它只适用一个CPU或者是一条收集线去执行回收任务。

ParNew收集器

  ParNew是一个新生代的多线程的收集器,它相当于是Serial的多线程版本。它的一些参数配置和Serial基本完全相同。只不过ParNew收集器在工作的时候,是多个线程工作的

  ParNew适合在多个CPU场景下使用,而我们的线上服务器基本都是多核CPU,所以,使用新生代的ParNew搭配老年代的CMS收集器还是挺常见的,我所在的部门的系统线上就是使用的ParNew+CMS组合。与Serial相同的是,ParNew在进行垃圾回收的时候,也会暂停所用的用户线程。

ParallelScavenge收集器

  ParallelScavenge也是一个新生代收集器,并且也是一个多线程收集器,ParallelScavenge关注的点是应用的吞吐量,吞吐量=用户代码运行时间/用户运行代码时间+GC时间,它提供了两个参数用来控制吞吐量,分别是控制最大垃圾收集停顿时间的-XX:MaxGCPauseMillis参数和直接设置吞吐量大小的-XX:GCTimeRatio参数。GCTimeRatio参数的值是一个大于0且小于100的整数,也就是垃圾收集时间占总时间的比率,相当于是吞吐量的倒数。高吞吐量可以高效的利用CPU时间,尽快完成计算任务,因此,ParallelScavenge收集器也用于需要密集计算不需要进行用户交互的一些后台。

SerivalOld收集器

  SerivalOld收集器是垃圾收集的老年代版本,也是一个单线程收集器。

ParallelOld收集器

  ParallelOld收集器是ParallelScavenge的老年代版本。可以使用ParallelScavenge+ParallelOld组合,在注重吞吐量和CPU资源敏感的场合可以优先考虑ParallellSCavenge和ParallellOld组合。

CMS(ConcurrentMarkSweep)收集器

  CMS(ConcurrentMarkSweep),并发标记清除,这是一种追求低停顿时间为的收集器。互联网时代,用户体验为王,垃圾收集的时间越短,给用户带来的体验就越好。CMS收集器整个回收过程可以分为四个步骤:

  初始标记(CMSinintmark)

  并发标记(CMSconcurrentmark)

  重新标记(CMSremarkmark)

  并发清除(CMSconcurrentsweep)

G1(GarBage-First)收集器

  G1收集器是一款面向服务端的收集器,也就是说,它将低停顿时间作为终极目标。G1与其他垃圾收集器的区别是它可以控制垃圾收集时间在某一个范围之内。与CMS垃圾收集的运行过程类似,它分为初始标记,并发标记,最终标记,筛选回收。G1之所以能够将停顿时间控制在一个指定的时间内,就是因为它可以选择性的进行回收。

  G1尝试着去满足最小的停顿时间,在G1中,停顿时间是可以设置的,是可控制的,之所以可以建立可预测的停顿时间模型,是因为G1避免了在java堆中进行全区域的垃圾收集。传统的新生代老年代的内存模型被多个大小相等的独立区域(Region)所取代。如下图所示,虽然新生代和老年代的概念还保留着,但是他们不再是物理隔离的了,他们都是由Region所组成。G1在清除阶段是有选择性的,它会根据设置的停顿时间,选择回报率最大的Region。Region可以说是G1回收器一次回收的最小单元。即每一次回收都是回收N个Region。这个N是多少,主要受到G1回收的效率和用户设置的软实时目标有关。

ZGC

  Z垃圾收集器(ZGC)是可伸缩的低延迟垃圾收集器。ZGC可以同时执行所有昂贵的工作,而不会将应用程序线程的执行停止超过10ms,这使得它适合于要求低延迟和/或使用非常大的堆(数TB)的应用程序。

  目前ZGC没有分代,每次GC都会标记整个堆,将堆分为2M(small),32M(medium),n*2M(large)三种大小的页面(Page)来管理,根据对象的大小来判断在哪种页面分配,大部分对象标记和对象转移都是可以和应用线程并发。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...