首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么时候选择SerialGC,ParallelGC而不是CMS,G1?

什么时候选择SerialGC,ParallelGC而不是CMS,G1?
EN

Stack Overflow用户
提问于 2019-02-10 11:30:22
回答 3查看 37.6K关注 0票数 37

在Java9中,G1 GC是默认的垃圾收集器。到目前为止,我听说过有些人更喜欢CMS垃圾收集器 over G1GC,因为它看起来不稳定,并且有一些令人讨厌的bug。

ParallelGC发生了什么事(这些天没有嗡嗡声)?有没有比CMS/G1更喜欢ParallelGC的用例?

另外,是否存在SerialGC可以执行所有这些并行收集器的情况?

EN

回答 3

Stack Overflow用户

发布于 2019-02-10 18:53:05

串行收集器

主要用于单cpu机.

算法:

它使用单个线程来处理堆,并在任何gc期间执行停止世界暂停.把它当成玩具吧。

这对于客户机类计算机( windows或单cpu计算机上的32位jvm )来说是默认的。

平行收集器

算法:

它使用多个gc线程来处理堆,并在任何gc期间执行停止世界暂停.

<= Java 8,这是服务器类计算机(多cpu类unix机器或任何64位jvm)的默认设置。

CMS收集器

它旨在消除与并行和串行收集器的完整gc相关联的长暂停。

算法:

它使用一个或多个gc线程定期扫描老一代,并丢弃未使用的对象,暂停时间很短,但占用更多的cpu时间。

警告:从14开始,删除了

G1收集器

它是低暂停/服务器风格的gc,主要用于大型堆(> 4Gb)。

算法:

  • 类似于CMS,它使用多个后台gc线程来扫描和清除堆。
  • 它把老一代分成几个部分,可以从一个部分复制到另一个部分来清洗老一代。 因此,获得碎片的可能性较小。

自Java以来,这是服务器类计算机(多cpu类9或任何64位jvm)的默认设置。

为什么使用G1作为缺省值?

主要原因是减少gc暂停时间,尽管总体吞吐量可能会降低。

票数 28
EN

Stack Overflow用户

发布于 2019-02-12 03:53:54

您可以阅读文档Java平台,标准版HotSpot虚拟机垃圾收集优化指南-Java 9

  • 串行收集器 它最适合于单处理器机器,因为它不能利用多处理器硬件,尽管它对于具有小数据集(高达100 MB)的应用程序非常有用。
  • 并联收集器 并行收集器也称为吞吐量收集器,它是类似于串行收集器的分代收集器。串行收集器和并行收集器之间的主要区别是,并行收集器有多个线程,用于加速垃圾收集。并行收集器适用于在多处理器或多线程硬件上运行的具有中等到大型数据集的应用程序。如果您不关心暂停时间,而更喜欢吞吐量,那么这个收集器将是最好的。
  • 主要并发收集器(CMS)

在Java9中不推荐这个收集器。

此收集器适用于喜欢更短时间的垃圾收集暂停并能够与垃圾收集共享处理器资源的应用程序。

  • G1垃圾收集器--这种服务器风格的收集器用于具有大量内存的多处理器计算机。它以很高的概率满足垃圾收集暂停时间目标,同时实现高吞吐量。

摘要:

  • 如果应用程序有一个很小的数据集(最多可达100 MB),那么选择带有-XX:+UseSerialGC选项的串行收集器。
  • 如果应用程序将在单个处理器上运行,并且不需要暂停时间,那么选择带有选项-XX:+UseSerialGC的串行收集器。
  • 如果(a)峰值应用程序性能是第一优先级,并且(b)不需要暂停时间或暂停一秒或更长的时间是可以接受的,那么让VM选择收集器或使用-XX:+UseParallelGC选择并行收集器。
  • 如果响应时间比总体吞吐量更重要,垃圾收集暂停必须保持在大约1秒以内,那么选择一个具有-XX:+UseG1GC或-XX:+UseConcMarkSweepGC的并发收集器。

问答:

  1. 我听说有些人更喜欢CMS垃圾收集器而不是G1GC,因为它看起来不稳定,并且有一些讨厌的bug。

对于大多数应用程序来说,G1收集器足够稳定。我在许多应用程序中都使用了G1收集器,它们都工作得很好。如果您可以将java9升级到Java11,那么它工作得更好,bug也更少。

  1. 有没有比CMS/G1更喜欢ParallelGC的用例?

是。有些应用程序需要更多的吞吐量,并且不关心使用并行收集器的暂停时间,这样会更好。例如,批处理任务、脱机作业、计算任务。

  1. 另外,是否存在SerialGC可以执行所有这些并行收集器的情况?

如果您在嵌入式系统上运行JVM,或者使用一个或两个CPU的系统,那么串行GC会更好。

最后,G1和CMS:在大多数情况下,G1可以代替CMS。在这种情况下,最好使用G1:

  1. 你有一大堆,就像16G。暂停时间与堆size.On之间存在正相关,相反,G1是增量收集器。
  2. 您有严格的暂停时间要求,并希望更多的可控暂停时间。比如,你想要暂停时间<=10ms。
票数 15
EN

Stack Overflow用户

发布于 2019-12-23 11:45:14

使用系列:

  • 只有1个1CPU可用,没有暂停要求-小型JVM存在于单机上(超过1CPU数量)-小型活动数据集(小于100 no )

使用并行:

  • 应用程序性能比低暂停时间更重要的非交互批处理应用程序
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54615916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档