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