垃圾收集算法

经典的垃圾回收算法以下几种:

标记–清除算法(Mark-Sweep)

回收前状态:

回收前
回收前

回收后状态:

回收后
回收后

优缺点:

优点:算法执行分为两个阶段标记与清除,所有的回收算法,基本都基于标记回收算法做了深度优化

缺点:效率问题,内存空间碎片(不连续的空间)

复制算法(Copying)

回收前状态:

Eden内存空间 8

Eden内存空间 8
Eden内存空间 8

Survivor1空间(From空间)1

Survivor1空间(From空间)1
Survivor1空间(From空间)1

Survivor2空间(To空间) 1

Survivor2空间(To空间) 1
Survivor2空间(To空间) 1

Eden内存空间与Survivor空间 8:1

Eden内存空间与Survivor空间 8:1
Eden内存空间与Survivor空间 8:1

回收后状态:

回收后状态
回收后状态

Survivor1空间(From空间)1

Survivor1空间(From空间)1
Survivor1空间(From空间)1

Eden内存空间与Survivor空间 8:1

Eden内存空间与Survivor空间 8:1
Eden内存空间与Survivor空间 8:1

优缺点:

优点比较标记清除算法,避免了回收造成的内存碎片问题

缺点:以局部的内存空间牺牲为代价,不过空间的浪费比较小,默认8:1的比例1是浪费的。复制也有一定的效率与空间成本

标记整理算法(Mark-Compact)

回收前状态:

回收前状态
回收前状态

回收后状态:

回收前状态
回收前状态

优缺点:

优点:避免了,空间的浪费,与内存碎片问题。

缺点:整理时复制有效率成本。

垃圾收集器

七种垃圾收集器

  • 1、 Serial(串行GC)-XX:+UseSerialGC
  • 2、 ParNew(并行GC)-XX:+UseParNewGC
  • 3、 Parallel Scavenge(并行回收GC)
  • 4、 Serial Old(MSC)(串行GC)-XX:+UseSerialGC
  • 5、 CMS(并发GC)-XX:+UseConcMarkSweepGC
  • 6、 Parallel Old(并行GC)-XX:+UseParallelOldGC
  • 7、 G1(JDK1.7update14才可以正式商用)
七种垃圾收集器
七种垃圾收集器

调优方法

新对象预留新生代

由于fullGC(老年代)的成本远比minorGC(新生代和老年代)的成本大,所以给应用分配一个合理的新生代空间,尽量将对象分配到新生代减小fullGC的频率

大对象进入老年代

将大对象直接分配到老年代,保持新生代对象的结构的完整性,以提高GC效率, 以通过-XX:PretenureSizeThreshold设置进入老年代的阀值

稳定与震荡的堆大小

稳定的对大小是对垃圾回收有利的,方法将-Xms和-Xmx的大小一致

吞吐量优先

尽可能减少系统执行垃圾回收的总时间,故采用并行垃圾回收器

1
-XX:+UseParallelGC或使用-XX:+UseParallelOldGC

降低停顿

使用CMS回收器,同时减少fullGC的次数

获取gc信息的方法

  • -verbose:gc或者-XX:+PrintGC  获取gc信息
  • -XX:+PrintGCDetails  获取更加详细的gc信息
  • -XX:+PrintGCTimeStamps  获取GC的频率和间隔
  • -XX:+PrintHeapAtGC  获取堆的使用情况
  • -Xloggc:D:\gc.log  指定日志情况的保存路径

jvm调优实战-tomcat启动加速

在tomcat的bin/catalina.bat文件的开头添加相关的配置