您的位置:首页 > 其它

gc一点理解

2017-10-11 13:47 148 查看
好像好久没有写博客 ,今天特地抽空看了一下jvm中垃圾回收算法

我们都知道java中当对象不在使用时,java会帮我们进行对象清除。下面特地介绍几种垃圾回收算法;

一:引用计数法 这是个比较古老而经典的垃圾回收算法,其核心就是在对象被引用时加1 ,而当引用不在使用时则减1,但是这种方法有个比较严重的问题,就是无法循环引用的情况。

二:标记清除法:就是分为标记和清除两个阶段进行处理内存中对象,当然这种方法也有比较大的弊端,就是碎片的问题,垃圾回收后的空间不是连续的,不连续的空间使用效率比较低。

三:复制算法:其核心思想就是将内存空间分为两块,每次只使用其中的一块,在垃圾回收时,将正在使用的内存中存活的对象复制到未使用的内存中,之后在清除之前使用的内存对象,反复去交换两个内存中的角色,完成垃圾收集。(Java中新生代使用这种算法)

四:标记压缩法:标记压缩法在标记清除基础上做了优化,把存活的对象压缩到内存一端,而后进行垃圾清理。(java中老年代就是使用这种算法)

垃圾收集器:

串行回收器: 串行回收器使用单线程进行垃圾回收,每次回收时,串行回收器只有一个工作线程,对于并行能力较弱的计算机来说,串行回收器的专注性与独占性往往有更好的性能提现。使用-XX:+UseSerialGC 参数可以设置新生代串行回收器和老年代串行回收器。

并行回收器:

1.parNew回收器, 是一个工作在新生代的垃圾回收器,他只是简单的将串行回收多线程化,他的回收策略和算法和串行回收器一样的。

使用 -XX:UseParNewGC 新生代ParnNew 回收器,老年代则使用串行回收器

2. 新生代ParallelGC 回收器,使用了复制算法的收集器,也是多线程独占形式的收集器,但ParallelGC回收器有个重要的特点 ,就是它非常关注系统的吞吐量。

3.老年代ParallerOldGC 回收器也是一种多线程的回收器,和新生代的ParallerGC回收器一样,也是一种关注吞吐量的回收器 它使用的标记压缩器算法进行实现的。

cms回收器:   

它使用的是标记清除算法,主要关注系统停顿时间。

使用-XX:+UseConcMarkSweepGC 进行设置。

使用-XX:+ConGCThreads 设置并发线程数量。

CMS并不是独占的回收器,也就说CMS回收的过程中,应用程序仍然在不停的工作,又会有新的垃圾不断的产生,所以在使用CMS在使用过程中确保应用程序内存足够可用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: