今天华清Java学院小编要为大家分享的是JVM调优之垃圾收集器。java语言大的特点就是可以进行自动垃圾回收处理,无需开发人员过于关注系统资源的释放情况。自动垃圾收集虽然大大减轻了开发人员的工作量,但同时也增加了软件系统的负担。一个不合适的垃圾回收方法和策略会对系统造成不良影响。今天就和大家分享一下JVM垃圾收集器的一些知识。
1.垃圾与回收算法思想
引用计数法:
引用计数法是经典也是古老的的一种垃圾回收方法,引用计数器的实现很简单,对于一个对象A,只要任何一个对象引用了A,则A的计数器上就加1,当引用失效就减1,当A的引用计数器值为0时,则A就不会再被引用。
引用计数器的实现也很简单,但是有一个严重的问题,即无法处理相互引用的情况。就比如A对象引用了B对象,同时B对象也引用的A对象,除此之外在没有其他对象应用A和B,则A和B引用计数器的值都不为0,但是A和B均不会再被使用,这样就导致不能回收到A和B对象,引起内存泄露。
标记-清除算法:
标记清除算法是现代垃圾回收算法的思想基础。标记清除算法把垃圾回收分为两个阶段:标记阶段和清除阶段。一种可行的实现是,在标记阶段,首先通过根节点,标记所有从根节点可达的对象。因此未标记的对象就是未被引用的垃圾对象。然后在清除阶段,清除所有未被标记的对象。标记-清除算法大的一个问题就是空间碎片。以为回收后的空间是不连续的,工作效率低于连续的内存空间。
复制算法:
复制算法是一种相对高效的回收方法。它的核心思想是:将原有的内存空间分成两块,每次只使用其中的一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,清除正在使用的内存块中的所有对象,交换两个内存块角色,完成垃圾回收。在JVM新生代中survivor中使用了复制算法进行垃圾回收。如果系统中的垃圾对象很多,复制算法需要复制的存活对象数量并不会太大,因此在垃圾回收时,复制算法的效率是很高的。且复制是统一将存活对象复制到新的内存区域中,因此不会产生空间碎片。
标记-压缩算法:
复制算法的高效性是建立在垃圾对象多,存活对象少的前提下。这种情况年轻代经常发生,但是对于老年代往往是存活对象多,垃圾对象少,在这种情况下复制的成本也将很高,因此复制算法并不适合老年代垃圾回收。
标记-压缩算法是一种老年代的垃圾回收算法,它在标记-清除算法的基础上做了一些优化。标记-压缩算法首先也是需要从跟节点开始,对所有可达对象做一次标记,然后将所有存活对象压缩到内存的一端,然后清除掉边界外的所有空间。这种算法避免了碎片的产生,也不需要两个相同的内存空间,因此性价比较高。
增量算法:
对大部分垃圾回收算法而言,在垃圾回收的过程中,应用系统软件处于一种“Stop the World”的状态。在“Stop the World”状态下应用程序的所有线程都会挂起,暂停一切正常的工作,等待垃圾回收的完成。如果垃圾回收时间很长,应用系统暂停时间也会很长,影响用户体验。
增量算法的基本思想是如果一次性将所有垃圾进行处理,需要造成系统长时间的停顿,那么可以让垃圾收集和应用程序交替止执行。每次,垃圾收集之回收一小片内存区域,接着切换到应用程序执行。如此反复直到垃圾回收完成。这种间断式的垃圾收集虽然减小了应用系统的等待时间,但是由于线程的切换和上下文替换的消耗,会使得垃圾回收的整体成本升高。
分代:
前面介绍的复制、标记-清除、标记-压缩等算法,并没有一种算法可以完全替换其他算法。它们都有各自的优缺点。因此根据垃圾回收对象的特点不同,使用不同的回收算法才是明智之举。
分代就是基于这种思想,它将内存区域根据对象的特点分成不同的内存区域,根据每块区域对象的特征不同使用不同的回收算法,以提高工作效率。
2.JVM垃圾收集器的类型
按线程数分:
串行:一次只使用一个线程继续垃圾回收。
并行:一次开启多个线程进行垃圾回收。在cup能力较强时使用并行可以提高垃圾收集效率,缩短GC停顿时间。
按工作模式分:
并发式:并发式垃圾收集器与应用系统交替工作,以尽可能减少应用系统的停顿时间。
独占式:独占式垃圾收集器一旦运行“Stop the World”就停止应用程序运行,直到垃圾收集完全接受,才允许应用程序执行。
按工作内存区间分:
新生代垃圾收集器:只在新生代工作。
老年代垃圾收集器:只在老年代工作。
3.垃圾收集器
新生代串行收集器:单线程、独占式、复制算法;单CPU处理器时性能优越。
老年代串行收集器:单线程、独占式、标记-压缩算法;
并行收集器:工作在新生代、将新生代串行收集器多线程化,回收策略、算法、参数和新生产串行收集器一样。
新生代并行收集器:和并行收集器一样,但是可以设置“大垃圾收集停顿时间”和“吞吐量大小”。自适应GC条件策略。
老年代并行收集器:标记-压缩算法,可以设置“大垃圾收集停顿时间”和“吞吐量大小”。
CMS收集器:并发、标记、清除
G1收集器:标记压缩算法,可以进行精确停顿控制(在M时间内,停顿时间不超过N),预期优于CMS收集器。
热点新闻