JAVA垃圾回收详解(应用篇)
1、新生代串行收集器
串行收集器是所有垃圾收集器中最老的一种,它有两个特点:第一,仅使用单线程进行垃圾回收;第二,它是独占式收集器新生代串行处理器使用复制算法,实现相对简单,逻辑处理特别高效,切没有线程切换开销,在诸如单核CPU或者较小应用内存平台,它的性能表现可以超过并行回收器和并发回收器。
使用-XX:UseSerialGC参数可以指定使用新生代串行收集器和老年串行收集器。
2、老年代串行收集器
老年代串行收集器使用的是标记-压缩算法,和新生代串行收集器一样,它也是一个串行的,独占式的垃圾回收器。由于老年代垃圾回收通常比新生代垃圾回收需要更长时间,因此,在堆空间较大的应用程序中,一旦老年代串行收集器启动,程序很可能因此停顿数秒甚至更长。虽然如此,作为老牌的垃圾回收器,老年代串行收集器可以和多种新生代回收器配合使用,同时他也可以作为CMS回收器的备用回收器。
使用-XX:UseSerialGC:新生代,老年代都是用串行收集器。
使用-XX:UseParNewGC:新生代使用并行收集器,老年代使用串行收集器
3、并行收集器
并行收集器是工作在新生代的垃圾回收器,它只是简单的将串行回收器多线程化,它的回收策略,算法以及参数与串行回收器一样。并行回收器也是独占式的,收集过程中,应用程序也会全部暂停。在并发能力比较强的CPU上,它产生的停顿时间要短于串行回收器,而在单CPU或者并发能力较锁的系统中,其效果不会比串行收集器要好,甚至会更差。-XX:UseParNewGC:新生代使用并行收集器,老年代使用串行回收器。
-XX:UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS
并发收集器工作时的线程数量可以使用-XX:ParallelGCThread参数指定,一般最好与CPU数量相当。
4、新生代并行回收收集器
新生代并行回收收集器是使用复制算法的收集器,此收集器与并行收集器一样,都是多线程,独占式收集器,但是并行回收收集器有一个非常重要的特点:非常关注系统吞吐量。-XX:UseParallelGC:新生代使用并行回收收集器,老年代使用串行收集器
-XX:UseParallelOldGC:新生代和老年代都使用并行回收收集器。
并行回收收集器提供了两个重要的参数用于控制系统吞吐量:
-XX:MaxGCPauseMillis:设置最大垃圾回收停顿时间
-XX:GCTimeRatio:设置吞吐量大小,它的值是一个0~100的值,假设设为n,那么系统将花费不超过1/(1+n)的时间用于垃圾回收。
5、老年代并行回收收集器
它与新生代并行回收收集器一样,也是一种关住吞吐量的收集器,不过它采用的是算法是标记-压缩算法,并且在JDK1.6中才可以使用6、CMS收集器
与并行回收器不同,CMS收集器主要关住系统停顿时间,它的工作模式略显复杂,主要步骤有:初始标记,并发标记,重新标记,并发清楚,并发重置,其中初始标记和重新标记都是独占式的,其他步骤是和用户线程一起执行的,因此从整体上来看,CMS收集不是独占式的。CMS是一个基于标记-清楚算法的回收器,在算法篇中已经提到过,标记-清楚算法会造成大量内存碎片,造成无法为大对象分配空间,这种情况下,即是堆内存仍然有较大剩余空间,也可能被迫进行一次垃圾回收,这种现象对系统极为不利,为了解决这个问题,CMS收集器提供了以下几个参数
-XX:UseCMSCompactAtFullCollection开关可以使CMS在垃圾回收收集完成后,进行一次内存碎片整理,此过程不是并发进行的
-XX:CMSFullGCsBeforeCompaction参数可以设定多少次CMS回收后,进行一次内存压缩。
7、G1收集器
G1收集器是目前最新的垃圾回收器,伴随JDK1.7发布,G1收集器目前还是一个实验性产品,它的目标是作为一个服务端的垃圾收集器,因此,在吞吐量和停顿控制上,逾期要优于CMS收集器。与CMS收集器相比,G1收集器是基于标记-压缩算法的,因此,他不会产生内存碎片,G1收集器还可以进行非常精确的停顿控制,他可以让开发人员指定在长度为M的时间段内,垃圾回收时间不超过N
使用一下参数可以启用G1回收器:
-XX:UnlockExperimentalVMOption -XX:UseG1GC
设置G1回收器的目标停顿时间:
-XX:MaxGCPauseMillis =50
-XX:GCPauseIntervalMillis=200
以上参数指定在200ms内,停顿时间不超过50ms,这两个参数只是目标,G1回收器不能保证能执行它们。