参考:《实战Java虚拟机

1 垃圾回收器:串行回收器

特点:串行、独占

适用于单核处理器的服务器,Client模式(现在基本都是Server模式)默认使用的垃圾收集器。多核下就不推荐使用了。

回收算法:新生代复制算法,老年代标记压缩

 

用法:

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

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

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

 

 

2 垃圾回收器:并行回收器之ParNew

特点:多线程、独占

在多核处理器下,性能优于串行处理器,但单核下还不如串行处理器(Serial)

回收算法:标记压缩

 

用法:

    

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

    -XX:ParallelGCThreads    回收器线程数量(cpu <= 8) cpu个 : (3 + (5*cpu)/8)

 

3 垃圾回收器:并行回收器之ParallelGC

特点:多线程、独占、关注系统吞吐量(即关注垃圾回收总时间)

并行,关注系统吞吐量

回收算法:复制

 

用法:

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

    -XX:+UseParallelGC    新生代Parallel回收器,老年代ParallelOld回收器

    -XX:MaxGCPauseMillis    垃圾收集最大停顿时间,设置的小,会导致回收次数变多,垃圾回收总时间变大(吞吐量下降)

    -XX:GCTimeRatio    吞吐量大小(0~100),作用与上面的相反,设置的越大,回收次数越小。

    -XX:+UseAdaptiveSizePolicy    可设置自适应GC策略,系统自动找最大停顿时间与吞吐量的平衡值(真方便,萌新用起来真好)

 

 

4 垃圾回收器:并行回收器之CMS

cms分为多个阶段回收,把标记跟清除的阶段分离出来,降低STW的时间(可见初始标记、重新标记是会造成STW)

 

JVM垃圾收集器_JVM

 

特点:多线程、并行(只有初始/重新标记 才是串行)

并行,关注最小停顿时间

回收算法:标记清除

 

用法:

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

    -XX:CMSInitiatingOccupancyFraction    默认68,表示老年代空间使用率=68%时进行CMS回收(设置过小会频繁回收)

    -XX:+CMSClassUnloadingEnabled    可添加这个参数,cms就会回收perm区的class数据

 

注意点:因为CMS采用标记清除算法,所以会导致大量内存碎片,CMS解决的办法是回收几次后统一处理这些碎片。

 

5 垃圾回收器:并行回收器之G1

多线程、并发的分代回收器,目标是替代CMS,可用于新生代和老年代。相对于CMS,G1处理每次回收都能有效复制对象,减少内存碎片。并且只选取部分进行回收,缩小回收范围,降低全局停顿带来的影响。并采用混合回收,优先回收垃圾比例较高的区域。

 

JVM垃圾收集器_新生代/老年代_02

 

特点:多线程、并行(只有初始/重新标记 才是串行)

并行,关注最小停顿时间

回收算法:标记清除

 

用法:

    -XX:+UseG1GC    新生代G1回收器,老年代G1

 

6 线程本地分配缓存TLAB

TLAB本身占用了eden区空间,用于给对应线程分配内存。目的就是为了加速对象分配,对象分配顺序如下:

 

JVM垃圾收集器_Java虚拟机_03