一、垃圾回收的算法
1、引用记数法 记录对像的引用数量
2、标记-清除算法 会产生空间碎片
3、复制算法 需要使用两块大小相同的内存,应用于新生代
4、标记压缩算法 将所有存活对像压缩到内存的一端,再清理边界外所有空间,应用于老年代
二、垃圾回收的类型
1、新生代串行收集器 特点:独占、单线程、串行,复制算法
2、老年代串行收集器 特点:独占、单线程、串行,标记-压缩算法
3、新生代并行收集器 特点:独占、多线程、并行,复制算法,关注系统吞吐量
4、老年代并行收集器 特点:独占、多线程、并行,标记-压缩算法,关注系统吞吐量
5、CMS(并发标记清除)收集器 特点:非独占、多线程,标记-清除算法
工作步骤:初始标记(独占)、并发标记、重新标记(独占)、并发清理、并发重置
CMS收集器执行过程中,出现内存不足会导致回收失败,这时JVM会启动老年代串行收集器回收
三、垃圾回收调优参数
1、串行GC调优参数
-XX:+UseSerialGC:新生代和老年代使用串行收集器
-XX:SurvivorRatio:设置eden区和survivor区大小的比例
-XX:PretenureSizeThreshold:设置大对像直接进入老年代的对像大小阈值
-XX:MaxTenuringThreshold:设置对像进行老年代的年龄阈值
2、并行GC调优参数
-XX:+UseParNewGC:新生代使用并行收集器
-XX:+UseParallelOldGC:老年代使用并行收集器
-XX:ParallelGCThreads:设置用于垃圾回收的线程数,通常和CPU数量相等
-XX:MaxGCPauseMillis:设置最大垃圾收集停顿时间
-XX:GCTimeRatio:设置吞吐量的大小,是一个0~100的整数
-XX:+UseAdaptivesSizePolicy:打开GC自适应策略
3、CMS调优参数
-XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
-XX:ParallelCMSThreads:设置用于CMS垃圾回收的线程数
-XX:CMSInitiatingOccupancyFraction:设置CMS收集器在老年代空间被使用多少后触发,默认为68%
-XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾回收后是否要进行一次内存碎片整理
-XX:CMSFullGCsBeforeCompaction:设置进行多少次CMS垃圾回收后,进行一次内存压缩
-XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收
-XX:+CMSParallelRemarkEnabled:启用并重新标记