终于搞明白 cms g1收集器的区别了

一、cms 收集器

cms 作为一款用户线程和收集线程并发执行的收集器,其设计理念是能够减少停顿时间(低停顿),那么怎么才能减少呢?最好的方式就是能够充分利用cpu,能够并发的去执行(多线程)。
用户线程也在执行?对象的引用地址不是会被改变吗?如果改变了堆中对象的内存地址,将导致用户线程无法定位到引用对象,从而导致无法正运行,什么样的算法会在执行过程不会改变对象呢?
想一想 jvm回收的算法:
1、标记清理(好像只是标记,然后清楚,原对象并没有被移动),虽然会产生内存碎片
2、复制(将内存一分为二,并将存活的对象复制到另一个内存块),很明显对象将被移动,不可以
3、标记整理(将存活动对象移到一端,从另一端进行清理),很明显对象也被移动了,不可以

通过分析这三种算法,好像只有 第一种满足cms的设计理念,因此即使有缺陷,但为了能够并行,cms还是选择了清记清除算法。
cms 收集过程
初始标记->并发标记->重新 标记->并发清理
在这里插入图片描述
下面理解下这四个过程:
1、初始标记:独占CP

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CMS收集器G1收集器都是Java虚拟机的垃圾收集器,用于对Java程序中产生的垃圾进行回收。它们都有各自的优缺点,并且适用于不同的场景。 CMS收集器(Concurrent Mark Sweep Garbage Collector)是一种基于标记清除算法的并发收集器。它的特点是在垃圾回收时,尽量减少应用线程的停顿时间,提高系统的响应速度。CMS收集器主要分为以下几步: 1. 初始标记:标记出GC Roots能直接关联到的对象,并且暂停所有应用线程。 2. 并发标记:标记出所有GC Roots能间接关联到的对象。 3. 重新标记:标记出在并发标记阶段中被修改的对象,并且暂停所有应用线程。 4. 并发清除:清除掉所有没有被标记的对象,并且不需要暂停应用线程。 CMS收集器的优点是能够最大程度地减少应用线程的停顿时间,但是它也有一些缺点,比如它会产生大量的内存碎片,这会影响到大对象的分配效率。 G1收集器(Garbage First Garbage Collector)是一种基于分代收集算法的垃圾收集器。它的特点是能够在不停顿应用线程的情况下,高效地回收大量的垃圾。G1收集器主要分为以下几步: 1. 初始标记:标记出GC Roots能直接关联到的对象,并且暂停所有应用线程。 2. 并发标记:标记出所有GC Roots能间接关联到的对象。 3. 最终标记:标记出在并发标记阶段中被修改的对象,并且暂停所有应用线程。 4. 筛选回收:根据垃圾回收的目标,将对象分为老生代和新生代,并且对老生代进行回收。 G1收集器的优点是能够高效地回收大量的垃圾,并且不会产生大量的内存碎片。但是它也有一些缺点,比如它的性能在处理大对象时可能会受到影响。 综上所述,CMS收集器适用于需要最大程度地减少应用线程的停顿时间的场景,而G1收集器适用于需要高效地回收大量的垃圾的场景。 ### 回答2: CMS收集器G1收集器是Java虚拟机中常用的两种垃圾回收器。作为Java领域的专家,我可以为您完成以下任务: 首先,我会为您介绍CMS收集器CMS(Concurrent Mark Sweep)收集器是Java虚拟机中一种以获取最短回收停顿时间为目标的垃圾收集器。它采用了并发的方式进行垃圾收集,可以与用户线程同时工作,减少垃圾回收对应用程序的影响。CMS收集器主要有四个阶段:初始标记、并发标记、重新标记和并发清除。它适用于对响应时间要求较高的应用场景,但存在可用内存空间碎片化的问题,可能导致内存回收效率下降。 其次,我会为您介绍G1(Garbage First)收集器G1收集器是Java虚拟机中一种面向服务端应用的垃圾收集器。它以获取更平稳的停顿时间为目标,能够对大堆内存进行高效回收。G1收集器将堆划分为若干个大小相等的区域,并根据垃圾分布情况优先回收垃圾最多的区域(garbage first原则),从而缩短回收停顿时间。G1收集器采用了分代收集和并发处理的技术,能够充分利用多核处理器,提升回收效率。它适用于对可靠性和低延迟有较高要求的应用场景。 综上所述,CMS收集器G1收集器是Java虚拟机中常用的两种垃圾回收器。CMS收集器以最短回收停顿时间为目标,采用并发方式进行垃圾收集,适用于对响应时间要求较高的应用场景;而G1收集器以平稳停顿时间为目标,采用分代和并发处理技术,适用于对可靠性和低延迟有较高要求的应用场景。根据具体的应用需求和性能指标,可以选择适合的垃圾收集器来优化应用程序的性能和资源利用。 ### 回答3: CMS收集器(Concurrent Mark Sweep)和G1收集器(Garbage First)都是Java虚拟机的垃圾回收器。 CMS收集器是一种以“并发”和“低停顿”为目标的垃圾回收器。它的特点是在垃圾回收过程中,可以与用户线程并发执行。这意味着它可以在垃圾回收的同时,让应用程序继续运行,减少了停顿时间,提高了应用程序的响应速度。CMS收集器主要用于对响应时间要求较高的应用,比如Web服务端应用。 G1收集器是Java虚拟机在JDK 7版本中引入的一种垃圾回收器,也是目前JDK 8默认的垃圾回收器。G1收集器是一种以“低停顿”和“高吞吐量”为目标的垃圾回收器。它通过将堆内存划分成多个大小相等的区域(Region)来管理对象,能够实现部分区域的并发垃圾回收。G1收集器采用导致停顿时间更可控的方式进行垃圾回收,可以通过设置期望的停顿时间目标来优化垃圾回收器的性能。G1收集器主要用于大内存应用,如需要处理几十GB到几百GB以上内存的应用。 相比而言,CMS收集器在垃圾回收时和用户线程并发执行,对停顿时间的控制能力更强。但是它存在着碎片问题,因为它无法进行整理内存,可能导致应用程序出现频繁的Full GC。而G1收集器通过使用Region来管理内存,可以避免碎片问题,同时还能控制停顿时间,但它在吞吐量方面不如CMS收集器。 总的来说,对于响应时间要求较高的应用,可以选择CMS收集器。对于大内存应用,可以选择G1收集器。当然,对于不同的应用场景,还需要根据具体情况进行性能测试和调优才能选取最适合的垃圾回收器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值