1. 概述
- 是最基本、历史最悠久的垃圾收集器了。JDK1.3之前回收新生代唯一的选择
- 作为HotSpot中Client模式下的默认新生代垃圾收集器
- Serial收集器采用复制算法、串行回收和”Stop-the-World”机制的方式执行内存回收
- 除了年轻代之外,还提供用于执行老年代垃圾收集的Serial old收集器。Serial old收集器同样也采用了串行回收和”Stop the World”机制,只不过内存回收算法使用的是标记-压缩算法。
- 收集过程全程Stop The World
Serial Old是运⾏在 Client 模式下默认的⽼年代的垃圾回收器
Serial Old 在 Server 模式下主要有两个⽤途:
① 可以与新⽣代的 Parallel Scavenge 配合使⽤。
② 作为⽼年代 CMS 收集器的后备垃圾收集⽅案,是⾼级垃圾回收器⽆法⼯作时的保底策略。
这个收集器是⼀个单线程的收集器,但它的 “单线程” 的意义并不仅仅说明它只会使⽤⼀个 CPU 或⼀条收集线 程去完成垃圾收集⼯作,更重要的是在它进⾏垃圾收集时,必须暂停其他所有的⼯作线程,直到它收集结束 (Stop The World)
2. 优势
- 简单而高效(与其他收集器的单线程比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。
- 运行在Client模式下的虚拟机是个不错的选择。
3. 场景
- 吞吐量小:内存回收工作量不大
- 容忍延迟:不在意卡顿
- 单核、内存小:0~100M 来自Oracle文档
- 客户端程序,应用以-client模式运行时,默认使用的就是Serial
4. 参数
- -XX:+UseSerialGC
- 可以指定年轻代和老年代都使用串行收集器
- 等价于新生代用Serial GC,且老年代用Serial0ldGc
5. 测试
/**
* -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintGCTimeStamps
* eden so s1 8:1:1 8M
* 0.25*27 6.5M 26 27
* 0.2 33 6.6 33 34
*/
public class SerialGC {
private static int size = 1024 * 200;
public static void main(String[] args) {
for (int i = 0; i < 34; i++) {
byte[] allo = new byte[size];
}
}
}