JVM垃圾收集器

参考:《实战Java虚拟机
1 垃圾回收器:串行回收器
特点:串行、独占
适用于单核处理器的服务器,Client模式(现在基本都是Server模式)默认使用的垃圾收集器。多核下就不推荐使用了。
回收算法:新生代复制算法,老年代标记压缩
 
用法:
    -XX:+UseSerialGC        新生代,老年代都用串行回收器
    -XX:+UseParNewGC    新生代ParNew回收器,老年代串行回收器
  -XX:+UseParallelGC    新生代Parallel回收器,老年代串行回收器
 
 
2 垃圾回收器:并行回收器之ParNew
特点:多线程、独占
在多核处理器下,性能优于串行处理器,但单核下还不如串行处理器(Serial)
回收算法:标记压缩
 
用法:
     -XX:+UseParNewGC    新生代ParNew回收器,老年代串行回收器
    -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垃圾收集器_第1张图片
 
特点:多线程、并行(只有初始/重新标记 才是串行)
并行,关注最小停顿时间
回收算法:标记清除
 
用法:
    -XX:+UseConcMarkSweepGC    新生代ParNew回收器,老年代CMS
    -XX:CMSInitiatingOccupancyFraction    默认68,表示老年代空间使用率=68%时进行CMS回收(设置过小会频繁回收)
    -XX:+CMSClassUnloadingEnabled    可添加这个参数,cms就会回收perm区的class数据
 
注意点:因为CMS采用标记清除算法,所以会导致大量内存碎片,CMS解决的办法是回收几次后统一处理这些碎片。
 
5 垃圾回收器:并行回收器之G1
多线程、并发的分代回收器,目标是替代CMS,可用于新生代和老年代。相对于CMS,G1处理每次回收都能有效复制对象,减少内存碎片。并且只选取部分进行回收,缩小回收范围,降低全局停顿带来的影响。并采用混合回收,优先回收垃圾比例较高的区域。
 
JVM垃圾收集器_第2张图片
 
特点:多线程、并行(只有初始/重新标记 才是串行)
并行,关注最小停顿时间
回收算法:标记清除
 
用法:
    -XX:+UseG1GC    新生代G1回收器,老年代G1
 
6 线程本地分配缓存TLAB
TLAB本身占用了eden区空间,用于给对应线程分配内存。目的就是为了加速对象分配,对象分配顺序如下:
 
JVM垃圾收集器_第3张图片
 
 
 

你可能感兴趣的:(JAVA)