目录
概述
上一章我们分析了垃圾收集算法,那这一章我们来认识一下这些垃圾收集器是如何运用这些算法的。
不同的虚拟机也会提供各种参数,让用户自由的选择使用哪些分代收集器。
如图:
这里有七种不同的分代收集器,存在连线的证明可以搭配组合使用。 上面的Young部分是新生代收集器,下面的Tenured是老年队收集器。 接下来分析一下各个收集器的运行原理。
STW
了解之前这些收集器之前,我们要先了解一个概念,叫做“Stop the World”,简称STW,就是在运行垃圾收集算法的时候,Java虚拟机中其他所有的用户线程都要停止。 等到GC线程运行完成之后,才会再次运行。
那么对于一些运算实时性要求较高的系统,如果每隔一个小时就要停止几分钟,肯定是受不了的吧。
所以,这些年垃圾收集器不断进化的过程中,也在不断地减少STW的时间,尽量少的影响用户线程。
收集器的并发和并行
从ParNew收集器之后,将会接触到若干款涉及“并发”和“并行”概念的收集器。有必要先解释清楚这两个名词。并行和并发都是并发编程中的专业名词,
在谈论垃圾收集器的上下文语境中,它们可以理解为:
- 并行(Parallel):并行描述的是多条垃圾收集器线程之间的关系,说明同一时间有多条这样的线程在协同工作,通常默认此时用户线程是处于等待状态。
- 并发(Concurrent):并发描述的是垃圾收集器线程与用户线程之间的关系,说明同一时间垃圾
收集器线程与用户线程都在运行。由于用户线程并未被冻结,所以程序仍然能响应服务请求,但由于垃圾收集器线程占用了一部分系统资源,此时应用程序的处理的吞吐量将受到一定影响。
Serial收集器
这个收集器是最基础、历史最悠久的收集器。 只看名字就可以知道,它是一个单线程的收集器。但是这个单线程并不是仅仅说只会用一个收集线程去完成垃圾收集工作,重要的是在运行的时候必须要暂停其他所有的用户线程,只有这一个GC线程运行,直到它收集完成。
如