首页 > 试题广场 >

串行(serial)收集器和吞吐量(throughput)收

[问答题]
串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?
串行收集器在GC时会停止其他所有工作线程(stop-the-world),CPU利用率是最高的,所以适用于要求高吞吐量(throughput)的应用,但停顿时间(pause time)会比较长,所以对web应用来说就不适合,因为这意味着用户等待时间会加长。而并行收集器可以理解是多线程串行收集,在串行收集基础上采用多线程方式进行GC,很好的弥补了串行收集的不足,可以大幅缩短停顿时间(如下图表示的停顿时长高度,并发比并行要短),因此对于空间不大的区域(如young generation),采用并行收集器停顿时间很短,回收效率高,适合高频率执行。
发表于 2017-03-27 16:02:04 回复(0)
更多回答
串行GC:整个扫描和复制过程均采用单线程的方式,相对于吞吐量GC来说简单;适合于单CPU、客户端级别。
吞吐量GC:采用多线程的方式来完成垃圾收集;适合于吞吐量要求较高的场合,比较适合中等和大规模的应用程序。
发表于 2017-03-25 22:23:23 回复(3)
吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。串行收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,而吞吐量收集器则的目标是达到一个可控制的吞吐量。此外,吞吐量收集器具有自适应调节策略的能力。
发表于 2016-04-01 11:19:30 回复(1)

Serial 收集器

  • Serial 收集器是历史悠久,最基本的收集器。它是一个单线程的收集器(说明:这里的单线程不仅仅是指收集器工作时使用一个CPU或者一条收集线程去收集,并且Serial工作时,必须暂停其他所有的工作线程,也就是“stop the world”,直到垃圾收集完成。)Serial是JVM运行在Client模式默认的新生代收集器。

throughput收集器

  • 也叫做Parallel Scavenge 收集器,它的目标是达到一个可控制的吞吐量(throughput),(说明:吞吐量就是CPU用于执行代码的时间和CPU总共消耗时间的比值,即:吞吐量 = 运行代码时间 / (运行代码时间 + 垃圾收集器工作时间)),JVM提供了两个参数以精确的控制吞吐量,-XX:MaxGCPauseMillis 最大收集停顿时间;-XX:GCTimeRatio 垃圾收集时间占总时间的比例。

总结

  • 了解了他们各自的特性,那么他们之间的不同点就显而易见了,Serial收集器工作时 "stop the world",简单而高效。而throughput收集器更关注总体的吞吐量,收集效果和性能总是密切关联的。
参考:深入理解JVM虚拟机 3.5节
发表于 2019-05-13 09:38:59 回复(1)

串行收集器:

这个收集器是一个单线程的收集器,但它的“单线程”的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束(Stop The World)。

应用场景:

Serial收集器是虚拟机运行在Client模式下的默认新生代收集器。

优势:

简单而高效(与其他收集器的单线程比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。

吞吐量收集器:

先讲一下吞吐量的定义:
吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量 = 运行用户代码时间 /(运行用户代码时间 + 垃圾收集时间)。
虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。

特性:

吞吐量收集器是一个新生代收集器,它也是使用复制算法的收集器,又是并行的多线程收集器。

应用场景:

停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验,而高吞吐量则可以高效率地利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。

发表于 2019-05-12 21:48:28 回复(0)

串型gc是单线程的,在要求不高简单的场合下使用。吞吐量gc是多线程的,在复杂情况下使用。

发表于 2020-03-05 20:17:15 回复(0)
串行收集器用于小型应用,是单线程 吞吐量收集器用中大型应用,是多线程
编辑于 2019-11-22 00:03:25 回复(0)
复制的都是垃圾
发表于 2017-01-09 19:53:51 回复(1)
串行收集器是单次作用的,也就是用户线程和垃圾收集线程不能同时进行,而并行线程却可以在垃圾收集的同时执行用户线程,这样就提高了单位时间类的作业吞吐量
发表于 2020-11-22 09:12:59 回复(0)
<p>很不错的解释,为网友帖子点赞👍</p>
发表于 2020-05-21 21:50:31 回复(0)
串行单线程,适用于小型程序 吞吐量型多线程,适用于中大型程序
发表于 2019-05-10 09:57:15 回复(0)
吞吐量收集器使用并行版本的新生代垃圾,它用于中等和大规模数据的应用程序。而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。
发表于 2019-04-26 23:03:59 回复(0)

吞吐量收集器使用并行版本的新生代垃圾收集器用于中大型项目


发表于 2019-04-26 22:37:50 回复(1)
吞吐量收集器使用并行版本的新生代垃圾收集器,是使用多线程进行垃圾收集的,适合于中、大规模数据的应用程序。 穿行收集器是使用单线程进行垃圾收集的,适合于小规模数据的应用程序(不大于100m),适合于单cpu或客户端
编辑于 2018-05-21 08:26:54 回复(0)
串行收集器应用于小型应用程序,一般是单线程方式扫描和复制。吞吐量收集器应用于并行环境中,适用于中大型规模数据的应用程序
发表于 2018-03-14 16:25:38 回复(0)
吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。串行收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,而吞吐量收集器则的目标是达到一个可控制的吞吐量。此外,吞吐量收集器具有自适应调节策略的能力。
发表于 2016-11-25 09:31:56 回复(0)
吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。而串型收集器堆大多数的小应用(在现代处理器上需要大概100m左右的内存)就足够了。
发表于 2016-03-25 22:10:04 回复(0)
zll头像 zll
吞吐量收集器使用并行版本的新生代垃圾收集器,其用于中等规模和大规模数据的应用程序。而穿行收集器对小应用来说就已经足够了。
发表于 2016-03-19 20:58:32 回复(0)
吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。
发表于 2016-03-12 11:45:34 回复(0)
吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。
发表于 2015-10-29 12:10:42 回复(0)