Garbage Collection - tenji/ks GitHub Wiki

垃圾回收器与内存分配策略

对象已死?

垃圾收集算法

1. 标记-清除算法(Mark-Sweep)

2. 复制算法(Copying)

3. 标记-整理算法(Mark-Compact)

4. 分代收集算法(Generational Collection)

垃圾收集器

1. Serial 收集器

Serial收集器是最基本、历史最悠久的收集器,曾经(在JDK 1.3.1之前)是虚拟机新生代收集的唯一选择。大家看名字就会知道,这个收集器是一个单线程的收集器,但它的“单线程”的意义不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。“Stop The World”这个名字也许听起来很酷,但这项工作实际上是由虚拟机在后台自动发起和自动完成的,在用户不可见的情况下把用户正常的线程全部停掉,这对很多应用来说都是难以接受的。

虽然Serial收集器有着各种缺点,但是到目前为止,它依然是虚拟机运行在Client模式下的默认新生代收集器。它也有着优于其他收集器的地方:简单而高效(与其他收集器的单线程比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。在用户的桌面应用场景中,分配给虚拟机管理的内存一般来说不会很大,停顿时间完全可以控制在几十毫秒最多一百多毫秒以内,只要不是频繁发生,这点停顿是可以接受的。所以,Serial收集器对于运行在Client模式下的虚拟机来说是一个很好的选择。

2. ParNew 收集器

3. Parallel Scavenge 收集器

4. Serial Old 收集器

5. Parallel Old 收集器

6. CMS 收集器

7. G1 收集器

内存分配与回收策略

参考链接

JVM中的G1垃圾回收器

Minor GC vs Major GC vs Full GC

Types of Java Garbage Collectors