您的位置:首页 > 其它

3.JVM垃圾回收机制-如何回收内存

2018-03-09 09:41 302 查看
在前面的文章中,我们已经介绍过哪些内存需要回收以及什么时候回收。

哪些内存需要回收:http://blog.csdn.net/u011983531/article/details/49227013

什么时候回收:http://blog.csdn.net/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.收集结束后会产生大量的内存碎片
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息