JVM调优之:垃圾收集器

java语言最大的特色就是能够进行自动垃圾回收处理,无需开发人员过于关注系统资源的释放状况。自动垃圾收集虽然大大减轻了开发人员的工做量,但同时也增长了软件系统的负担。一个不合适的垃圾回收方法和策略会对系统形成不良影响。java

1.垃圾与回收算法思想

引用计数法:

引用计数法是最经典也是最古老的的一种垃圾回收方法,引用计数器的实现很简单,对于一个对象A,只要任何一个对象引用了A,则A的计数器上就加1,当引用失效就减1,当A的引用计数器值为0时,则A就不会再被引用。算法

引用计数器的实现也很简单,可是有一个严重的问题,即没法处理相互引用的状况。就好比A对象引用了B对象,同时B对象也引用的A对象,除此以外在没有其余对象应用A和B,则A和B引用计数器的值都不为0,可是A和B均不会再被使用,这样就致使不能回收到A和B对象,引发内存泄露。多线程

标记-清除算法:

标记清除算法是现代垃圾回收算法的思想基础。标记清除算法把垃圾回收分为两个阶段:标记阶段和清除阶段。一种可行的实现是,在标记阶段,首先经过根节点,标记全部从根节点可达的对象。所以未标记的对象就是未被引用的垃圾对象。而后在清除阶段,清除全部未被标记的对象。标记-清除算法最大的一个问题就是空间碎片。觉得回收后的空间是不连续的,工做效率低于连续的内存空间。并发

复制算法:

复制算法是一种相对高效的回收方法。它的核心思想是:将原有的内存空间分红两块,每次只使用其中的一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,清除正在使用的内存块中的全部对象,交换两个内存块角色,完成垃圾回收。在JVM新生代中survivor中使用了复制算法进行垃圾回收。若是系统中的垃圾对象不少,复制算法须要复制的存活对象数量并不会太大,所以在垃圾回收时,复制算法的效率是很高的。且复制是统一将存活对象复制到新的内存区域中,所以不会产生空间碎片。性能

标记-压缩算法:

复制算法的高效性是创建在垃圾对象多,存活对象少的前提下。这种状况年轻代常常发生,可是对于老年代每每是存活对象多,垃圾对象少,在这种状况下复制的成本也将很高,所以复制算法并不适合老年代垃圾回收。优化

标记-压缩算法是一种老年代的垃圾回收算法,它在标记-清除算法的基础上作了一些优化。标记-压缩算法首先也是须要从跟节点开始,对全部可达对象作一次标记,而后将全部存活对象压缩到内存的一端,而后清除掉边界外的全部空间。这种算法避免了碎片的产生,也不须要两个相同的内存空间,所以性价比较高。spa

增量算法:

对大部分垃圾回收算法而言,在垃圾回收的过程当中,应用系统软件处于一种“Stop the World”的状态。在“Stop the World”状态下应用程序的全部线程都会挂起,暂停一切正常的工做,等待垃圾回收的完成。若是垃圾回收时间很长,应用系统暂停时间也会很长,影响用户体验。线程

增量算法的基本思想是若是一次性将全部垃圾进行处理,须要形成系统长时间的停顿,那么可让垃圾收集和应用程序交替止执行。每次,垃圾收集之回收一小片内存区域,接着切换到应用程序执行。如此反复直到垃圾回收完成。这种间断式的垃圾收集虽然减少了应用系统的等待时间,可是因为线程的切换和上下文替换的消耗,会使得垃圾回收的总体成本升高。对象

分代:

前面介绍的复制、标记-清除、标记-压缩等算法,并无一种算法能够彻底替换其余算法。它们都有各自的优缺点。所以根据垃圾回收对象的特色不一样,使用不一样的回收算法才是明智之举。内存

分代就是基于这种思想,它将内存区域根据对象的特色分红不一样的内存区域,根据每块区域对象的特征不一样使用不一样的回收算法,以提升工做效率。

2.垃圾收集器的类型

按线程数分:

串行:一次只使用一个线程继续垃圾回收。

并行:一次开启多个线程进行垃圾回收。在cup能力较强时使用并行能够提升垃圾收集效率,缩短GC停顿时间。

按工做模式分:

并发式:并发式垃圾收集器与应用系统交替工做,以尽量减小应用系统的停顿时间。

独占式:独占式垃圾收集器一旦运行“Stop the World”就中止应用程序运行,直到垃圾收集彻底接受,才容许应用程序执行。

按工做内存区间分:

新生代垃圾收集器:只在新生代工做。

老年代垃圾收集器:只在老年代工做。

3.垃圾收集器

新生代串行收集器:单线程、独占式、复制算法;单CPU处理器时性能优越。

老年代串行收集器:单线程、独占式、标记-压缩算法;

并行收集器:工做在新生代、将新生代串行收集器多线程化,回收策略、算法、参数和新生产串行收集器同样。

新生代并行收集器:和并行收集器同样,可是能够设置“最大垃圾收集停顿时间”和“吞吐量大小”。自适应GC条件策略。

老年代并行收集器:标记-压缩算法,能够设置“最大垃圾收集停顿时间”和“吞吐量大小”。

CMS收集器:并发、标记、清除

G1收集器:标记压缩算法,能够进行精确停顿控制(在M时间内,停顿时间不超过N),预期优于CMS收集器。

相关文章
相关标签/搜索