垃圾回收算法&垃圾回收器

1、引用计数法


为每个对象配备一个计数器,对于对象A,任何一个对象引用了A,则A的计数器加1,当引用失效时,计数器减1。只要A的计数器为0,则A就不能再被使用。

不足:

  • 对象相互引用的时候,无法回收

  • 每次引用和取消引用都要伴随加减操作,对性能有影响

2、标记清除法


标记清除算法先通过根节点标记所有可达对象,然后清除所有不可达对象,完成垃圾回收。

其最大的问题是会导致内存空间不连续,这导致对象,尤其大对象在堆空间分配时,工作效率要低于连续空间。

3、复制算法


复制算法,将内存分为两块,每次使用一块,回收时,将存活的对象移到未使用的内存块,之后清除正在使用的内存块,再交换两个块对象。其优点是在性能高,但内存要折半。

新生代串行回收期就是用了复制算法的思想。新生代分为eden, from, to三部分,其中from和to成为幸存者区域。当回收的时间,假设正在使用from,那么eden和from中年轻的对象都会移到to,大对象和老对象直接移到老年代,这样eden和from里存在的就只有垃圾对象,可直接清除。由于新生代垃圾对象通常多余存活对象,所以适合使用复制算法。

4、标记压缩算法


标记压缩算法,和标记清除算法一样,先标记垃圾对象,但在清除前,先将垃圾对象移到内存一端,可以理解为压缩整理,再清除,这样避免了内存不连续,也不需要复制算法那样两块内存,所以是性价比高的算法,适用于老年代。

5、分代算法


分代算法,简单理解就是分新生代,老年代,不同的年代选择不同的算法,比如新生代90%的对象都会不可用,所以适合复制算法

6、分区算法


分区算法,将堆空间分成独立的小空间,这样可以控制一次性回收多少个小空间,合理的回收小空间,减少回收卡顿。

垃圾回收器


1、串行回收器


串行回收器会使程序中所有线程暂停,进行等待,这对实时性要求的系统是不能接受的。

但其逻辑简单,没有线程切换开销,在大多数情况下性能还是不错的,当虚拟机在Client模式下,默认就是串行回收器。

-XX:+UseSerialGC:新生代、老年代都使用串行回收器。

-XX:+UseParNewGC:新生代使用ParNew回收器,老年代使用串行回收器。

-XX:+UseParallelGC:新生代使用Parallel回收器,老年代使用串行回收器。

2、并行回收器


ParNew回收器只是简单的将串行回收器并行化。在执行回收时,也是暂停其他线程。

ParNew回收器的线程数量可以通过-XX:ParallelGCThreads指定,一般在CPU小于8个时,配置跟CPU数相同,当大于8个时,3+(5*CPU/8)

-XX:+UseParNewGC:新生代使用ParNew回收器,老年代使用串行回收器。

-XX:+UseConcMarkSweepGC:新生代使用ParNew回收器,老年代使用CMS回收器。

ParallelGC回收器相比ParNew更注重吞吐量:

-XX:+UseParallelGC:新生代使用Parallel回收器,老年代使用串行回收器。

-XX:+UseParallelOldGC:新生代使用Parallel回收器,老年代使用ParallelOld回收器。ParallelOld回收器使用标记压缩算法,这个Parallel和ParallelOld的组合非常关注吞吐量。

-XX:MaxGCPauseMillis:设置最大垃圾回收停顿时间,在工作时会调整java堆或其他参数,尽可能把停顿时间控制在MaxGCPauseMillis以内。 减少单次的停顿时间,会使得堆减少,这样反而会增加GC的次数,最终导致吞吐量降低。

-XX:GCTimeRatio:设置吞吐量大小,0-100之间的数,默认19,则系统用于垃圾回收的时间不超过1/(1+19)=5%

-XX:UseAdaptiveSizePolicy:设置自适应GC调解策略,新生代、老年代的大小,eden、survivior的比例,晋升来年代的年龄参数都会自动调整,

以达到堆大小、吞吐量、停顿时间之间的平衡点。在手动调优困难的场合,可以使用自适应方式,仅指定虚拟机的最大堆、目标吞吐量(GCTimeRatio)、停顿时间(MaxGCPauseMillis),让虚拟机自己调优。

3、CMS回收器(Concurrent Mark Sweep)


从字面意思就知道使用标记清除算法。CMS主要关注停顿时间。 CMS默认启动并发线程数:(ParallelGCThreads+3)/4。

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

-XX:ConcGCThreads或者-XX:ParallelCMSThreads参数手工设置并发线程数。

-XX:CMSInitiatingOccupancyFraction:指定回收阈值,默认68,即老年代的空间使用率达到68%时,执行CMS回收。

-XX:+UseCMSCompactAtFullCollection:CMS在垃圾收集完成后,进行一次内存碎片整理。

-XX:CMSFullGCsBeforeCompaction:执行多少次CMS回收后,进行一次内存整理。

-XX:+CMSClassUnloadingEnabled:使用CMS的机制回收永久区(Perm)。

-XX:CMSInitiatingPermOccupancyFraction:激活CMSClassUnloadingEnabled后,当永久区达到这个百分比时,启动CMS回收。

3、G1回收器


JDK1.7中正式使用的全新垃圾回收器,用来取代CMS回收器。

  • G1可以和应用交替进行,部分工作可以和应用程序同事执行,因为不会在垃圾回收时完全阻塞应用程序。

  • G1可以兼顾年轻代和老年代,而其他回收器要么工作在年轻代,要么老年代。

  • G1在回收时,会进行对象复制移动,减少空间碎片;而CMS只是进行标记整理,若干次GC后进行一次碎片整理。

  • G1时分区的,所以可以只对部分分区GC。

-XX:+UseG1GC:开启G1回收器。

-XX:MaxGCPauseMillis:最大停顿时间。

-XX:ParallelGCThreads:线程数量。

-XX:InitiatingHeapOccupancyPercent:堆使用率达到多少时,出发并发标记周期执行,默认45。

4、其他参数


-XX:MaxTenuringThreshlod:默认15次GC后进入老年代,每一个MinorGC后对象年龄+1.

-XX:PretenureSizeThreshold:默认0字节,不指定进去老年代的对象大小,由运行情况而订。

-XX:SurvivorRatio:设置eden区和survivior区大小比例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值