好像好久没有写博客 ,今天特地抽空看了一下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在使用过程中确保应用程序内存足够可用。