如果说垃圾收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商、不同版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的收集器。
下图展示了七种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明他们是可以搭配使用的。
一、垃圾收集器的种类
1.1 Serial收集器和Serial Old收集器
运行过程
下图示意了Serial、Serial Old收集器的运行过程
Serial收集器是最基础、历史最悠久的收集器。这是一个单线程工作的收集器。“单线程”的意义并不仅仅是说明它会使用一个处理器或一条收集线程去完成垃圾收集工作,更重要的是强调它在垃圾收集时,必须暂停其他所有工作线程,直到它收集结束(STW)。
串行收集器新生代采用复制算法,老年代使用标记-整理算法。
优点
优点是简单,对于单CPU,由于没有多线程的交互开销,可能更高效。是默认的Client模式(桌面应用)下的新生代收集器。
缺点
停顿时间较长。
使用下面的命令来开启Serial + Serial Old 的收集器组合
-XX:+UseSerialGC
1.2 ParNew收集器和CMS收集器
运行过程
下图示意了ParNew、CMS收集器的运行过程
ParNew收集器实质上是Serial收集器的多线程并行版本。
它在垃圾收集时,同样会暂停其他所有工作线程,直到它收集结束(STW)。</