在这里简单介绍一下 垃圾回收相关算法:
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