GC垃圾回收算法

在这里简单介绍一下  垃圾回收相关算法:

  1.引用计数法:

        原理:为每个对象配备一个计数器,当有任一对象引用,计数器就加一,当引用失效,计数器就减一;

        缺点:无法处理循环引用(两个对象间相互引用)的问题,所以不适合用于jvm的垃圾回收;

2.标记-清除算法:

    原理:将垃圾回收分为 标记阶段,清除阶段;

            标记阶段:标记所有从根节点开始的可达对象,未被标记的对象就是未被引用的垃圾对象;

            清除阶段:清除所有未被标记的垃圾对象;

    缺点:会产生空间碎片,回收之后的内存空间不连续,使用率很低;

3,复制算法

     原理:    将内存空间分为两块,每次只使用其中一块;垃圾回收时,将正在使用内存的对象复制到未使用的内存块中,之后清除正在使用内存的所有对象,交换两个内存块,完成垃圾回收;

   缺点:将系统内存折半使用;(可在新生代使用;适用于垃圾对象较多,回收后存活对象少的情况 ) 

4.标记-压缩算法

   原理:是对标记-清除的优化,首先是对从根节点可达的对象进行标记,压缩阶段 是现将所有的存货对象压缩到一端,随后清理边界外的所有空间;

 优点:避免空间碎片的产生,且不需要两块相同空间

5:增量算法:

       在垃圾回收时,会挂起所有线程,等待垃圾回收的完成;增量算法的思想 就是让 垃圾回收线程和应用程序线程交替执行;

缺点:造成线程切换和上下文切换的消耗;

6.分代:

  根据对象的特点将内存分为几块,不同的地方实施不同的算法;

  新生代  复制算法

  老年代  标记-压缩算法

垃圾回收器的类型(简单分类)

 线程数:串行垃圾回收器和并行垃圾回收器

工作模式: 并发垃圾回收器和独占垃圾回收器;

碎片:压缩和非压缩

分代:新生代和老年代

新生代串行收集器:

 特点:使用单线程进行垃圾回收,是独占式垃圾回收;

          在串行收集器进行垃圾回收时,Java应用程序的线程都要暂停,等待垃圾回收的完成,称为 Stop the world;

老年代串行收集器:

  特点:使用的是标记压缩算法;串行,独占式垃圾收集器;停顿时间长;

并行收集器:

   特点:工作在新生代的垃圾收集器,多线程化,也是独占式的收集器,收集过程中应用程序会全部暂停;在并发能力强的cpu上,停顿时间少于垃圾回收;

新生代并行回收垃圾器:

  特点:多线程,独占式的收集器,关注系统吞吐量;

老年代并行回收收集器:

   特点:多线程,独占式的收集器,采用标记-压缩算法;关注 吞吐量;

CMS垃圾收集器:concurrent Mark Sweep 并发标记清除,使用的是标记清除算法,同时使用多线程进行回收的垃圾收集器;

关注 系统停顿时间;

工作步骤:初始标记(独占),并发标记,重新标记(独占),并发处理,并发重置

并发处理指的是在标记完成后正式回收垃圾对象;

并发重置指在垃圾回收后,重新初始化CMS数据结构和数据,为下一次垃圾回收做准备;

CMS 默认启动线程数:(ParallelGCThreads+3)/4   ParallelGCThreads指的是新生代并行收集器线程数,

GC相关参数总结:

 1.串行回收器相关:

    -XX:+UserSerialGC 新生代和老年代使用串行收集器;

    -XX:SurvivorRatio:设置eden区大小和survivor区大小的比例;

    - XX:PretenureSizeThreshold:设置大对象直接进入老年代的阀值;当大对象的大小直接超过这个值时,直接分配到老年代;

   -XX:MaxTenuringThreshold:设置对象进入老年代年龄的最大值;每一次minor gc后,对象年龄+1,任何对象年龄超限,进入老年代;

与并行GC的参数:

 -XX:+UseParNewGC:在新生代使用并行收集器;

-XX:+UserParallelOldGC:老年代使用并行收集器;

-XX:ParallelGCThreads:并行GC线程数;通常和cpu数量相等;在cpu较多的情况下,可以设置较小的值;

-XX:MaxGCPauseMillis:设置最大垃圾收集停顿时间。大于0;

-XX:GCTimeRatio:设置吞吐量大小;值在0-100之间;值为n,系统花费不超过1/(1+n)的时间用于垃圾回收;

-XX:+UseAdaptiveSizePolicy:打开自适应GC策略。在这种策略下,新生代大小,eden和survivor的比例,晋升老年代的对象年龄等参数会自动调整;

与CMS回收器相关的参数:

-XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集 器;

-XX:ParallelCMSThreads:设定CMS的线程数量;

-XX:CMSInintiatingOccupancyFraction:设置CMS在老年代空间使用多少被触发,默认68%;

-XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾回收后是否进行内存碎片的整理;

-XX:CMSFullGCsBeforeCompaction:设置CMS在多少次后进行内存压缩;

-XX:+CMSClassUnloadingEnabled:容许对类元数据进行回收;

-XX:+CMSParallelRemarkEnabled:启动并行重标记;

-XX:CMSInitiatingPermOccupancyFraction:当永久区占用比达到该比例时,启动CMS回收;(-XX:+CMSClassUnloadingEnabled激活的前提下)

-XX:UseCMSInitiatingOccupancyOnly:表示只有在达到该阀值时,启动CMS回收;

-XX:+CMSIncrementalMode:使用增量模式,比较适合单CPU;

-XX:+DisableExplicitGC:禁用显示GC





  


  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值