在前面的文章中,我们已经介绍过哪些内存需要回收以及什么时候回收。
哪些内存需要回收:http://blog.youkuaiyun.com/u011983531/article/details/49227013
什么时候回收:http://blog.youkuaiyun.com/u011983531/article/details/79479972
在本篇中,我们来看看具体如何回收已经不可用的内存。
一.垃圾回收算法
算法 | 描述 | 优点 | 缺点 |
---|---|---|---|
标记-清除算法 | 首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象 | 简单 | 1.效率不高,标记和清除过程效率都不高;2标记清除后会留下大量不连续的内存空间 |
复制算法 | 将可用内存分为大小相等的两块,每次使用其中一块,当一块内容用完时,就将还存活的对象复制到另一块上面,然后再把使用过的空间一次性清理掉 | 实现简单,运行高效 | 将可用内存空间缩小为原来的一半 |
标记-整理算法 | 首先标记出所有需要回收的对象,然后让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存 | 没有内存碎片 | 效率低 |
二.垃圾收集器
垃圾回收算法是内存回收的方法论,垃圾收集器是内存回收的具体实现。虚拟机包含的所有收集器如下图。
因为JVM使用了分代回收的思想,所以针对不同的内存区域,会采用不同的收集算法。
下面,我们对所有的收集器做一个对比。
新生代:
垃圾收集器 | 算法 | 是否Stop The Word | 线程 | 适用场景 | 优点 | 缺点 |
---|---|---|---|---|---|---|
Serial | 复制算法 | 是 | 单线程 | 运行在Client模式下的虚拟机 | 简单 | 1.效率低;2.垃圾收集期间必须暂停所有的工作 |
ParNew | 复制算法 | 是 | 多线程 | 适用于多CPU的环境 | 在多核情况下,能充分利用系统资源 | 垃圾收集期间必须暂停所有的工作 |
Parallel Scavenge | 复制算法 | 是 | 多线程 | 吞吐量优先的系统 | 能够控制吞吐量 | 垃圾收集期间必须暂停所有的工作 |
老年代:
垃圾收集器 | 算法 | 是否Stop The Word | 线程 | 适用场景 | 优点 | 缺点 |
---|---|---|---|---|---|---|
Serial Old | 标记-整理算法 | 是 | 单线程 | 运行在Client模式下的虚拟机 | 简单 | 1.效率低;2.垃圾收集期间必须暂停所有的工作 |
Parallel Old | 标记-整理算法 | 是 | 多线程 | 吞吐量优先的系统 | 能够控制吞吐量 | 垃圾收集期间必须暂停所有的工作 |
CMS | 标记-清除算法 | 是 | 多线程 | B/S系统的服务端 | 效率高,基本能实现垃圾收集线程与用户线程同时工作 | 1.对CPU资源非常敏感;2.无法处理浮动垃圾;3.收集结束后会产生大量的内存碎片 |