欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JVM垃圾收集器总结

程序员文章站 2022-03-25 20:17:17
前言: 了解了JVM垃圾回收算法之后就要说说垃圾收集器了。 一、三个概念 Stop-the-World:JVM执行任何一种GC算法时是会停止应用程序的执行的,所以大多数GC优化都是从减少Stop-the-world发生的时间来提高程序性能。 SafePoint:安全点。在JVM进行可达性分析的时候要 ......

前言:

  了解了jvm垃圾回收算法之后就要说说垃圾收集器了。

一、三个概念

stop-the-world:jvm执行任何一种gc算法时是会停止应用程序的执行的,所以大多数gc优化都是从减少stop-the-world发生的时间来提高程序性能。

safepoint:安全点。在jvm进行可达性分析的时候要在安全点进行,这个点是所有线程都被冻结,避免出现分析过程中对象的引用关系还在不断变化。前面说的程序停止不是随便停止,而是到达安全点之后再停顿下来。产生安全点的地方有:方法调用,循环跳转,异常跳转等

二、年轻代区的垃圾收集器

1、serial收集器

  单线程收集器,进行垃圾收集的时候必须暂停其他所有工作线程,直到收集结束。对于运行在client模式下的虚拟机是个很好的选择。可以通过设置-xx:+useserialgc进行使用,使用的是复制算法回收。

2、parnew收集器

  使用多条线程进行垃圾收集,其余行为和serial收集器一样,可以和cms收集器配合工作。可以通过设置-xx:+useparnewgc进行使用,一般使用在server模式下。使用的是复制算法回收。

3、parallel scavenger收集器

  前面两个收集器在于关注用户线程停顿时间,而这个收集器关注点在于达到一个可控的吞吐量【吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)】,适合在后台运算不需要太多交互的任务。可以通过设置-xx:+useparallelgc进行使用,是在server模式下的默认收集器。使用的是复制算法回收。

三、老年代区的垃圾收集器

1、serial old收集器

单线程收集器,进行垃圾收集的时候必须暂停其他所有工作线程,直到收集结束。client模式下的虚拟机默认的老年代收集器。可以通过设置-xx:+useserialoldgc进行使用,使用的是标记-整理算法回收。

2、parallel old收集器

  配合年轻代为parallel scavenger收集器使用的,行为都与parallel scavenger收集器差不多只是算法不一样。同样适合在后台运算不需要太多交互的任务。可以通过设置-xx:+useparalleloldgc进行使用。使用的是标记-整理算法回收。

3、cms收集器

  是一种以获取最短回收停顿时间为目标的收集器,可以通过设置-xx:+useconcmarksweepgc进行使用。基于标记-清除算法。运动过程有6个步骤:

  初始标记:需要虚拟机进行stop-the-world,仅标记一下gc roots所能连接到的对象

  并发标记:进行gc roots 追踪的过程,这时候程序不会停顿

  并发预清理:查找执行并发标记阶段从年轻代进入老年代的对象。

  重新标记:进行stop-the-world,扫描cms堆中的剩余对象

  并发清除:清理垃圾对象,程序不会停顿

  并发重置:重置cms收集器的数据结构

  使用这个收集器使得用户进程能在运行的时候进行清理垃圾对象。在清理过程中产生的垃圾对象会由下一次再回收。但是由于使用的是标记-清除算法,容易使得内存碎片化。

4、g1收集器

  这是一个既用于年轻代也用于老年代的收集器。使用g1收集器时java堆就会与使用其他收集器的布局不同。它是将整个java堆内存划分为多个大小相等的region,这样年轻代和老年代就不再物理隔离。

JVM垃圾收集器总结

 

  可以通过设置-xx:+useg1gc进行使用,使用的是复制+标记-整理算法回收。这样就不会出现内存碎片化。

  具备如下特点:

  并行与并发,使用多个cpu来缩短stop-the-world的停顿时间,这样在gc的时候不需要停顿java线程。使得gc和用户线程并发执行。

  分代收集:g1是存在于年轻代和老年代的收集器。年轻代使用负责算法,老年代使用收集器。

  空间整合。是基于标记-整理的算法实现的。可以解决内存碎片的问题。

  可预测的停顿。能让使用者明确指定在一个长度为m毫秒的时间片段内。

总结

  这个其实只是针对不同场景进行选择收集器,只需要了解收集器适用的场景和作用。具体的算法之前已经介绍过。