[JAVA修炼之路七]-JVM 垃圾回收器

一、各种回收器特点

1、新生代串行回收器

a、运行过程中,应用中所有线程停止工作(STW)

b、Client 模式下,默认收集器

c、分代复制算法

d、垃圾回收图

2、老年代串行回收器

a、启动方式:-XX:+UseSerialGC、-XX:+UseParNewGC、-XX:+UseParalllelGC

b、标记压缩算法、运行过程中,应用中所有线程停止工作(STW)

c、垃圾回收图

3、并行回收器

a、启动方式:-XX:+UseParNewGC、-XX:+UseConcMarkSweepGC

b、分代复制算法、运行过程中,应用中所有线程停止工作(STW)

c、指定并行线程数量 -XX:ParallelGCThreads,最好与CPU数量一致,避免过多线程数,影响垃圾回收性能。默认状况下,CPU小于8,采用CPU数量,如果大于8等于3+((5*CPU_Count)/8)

d、垃圾回收图

4、新生代ParallelGC回收器

a、启动方式:-XX:+UseParalllelGC、-XX:+UseParalllelOldGC

b、分代复制算法、运行过程中,应用中所有线程停止工作(STW)

c、非常关注系统的吞吐量

d、-XX:MaxGCPauseMills 设置最大垃圾收集停顿时间。如果设置的太小,它会灵活调整堆的大小,使时间在范围之内,但是有可能造成频繁的GC,从而增加了垃圾回收的总时间,影响吞吐率

e、-XX:GCTimeRatio 设置吞吐量大小。如果为19(默认值),将不会花费1/(1+19)=5%的时间用于垃圾收集

f、-XX:+UseAdaptiveSizePolicy 打开自适应GC策略,这种情况晋升老年代对象年龄、堆大小、吞吐量和停顿时间自动调整

5、老年代ParallelOldGC回收器

a、启动方式 -XX:+UseParalllelOldGC

b、标记压缩算法、运行过程中,应用中所有线程停止工作(STW)

c、-XX:ParallelGCThreads与并行回收器原理一样

6、CMS回收器

a、启动方式 -XX:+UseConcMarkSweepGC

b、标记清除算法

c、收集过程

•初始标记,标记根对象(STW)、
•并发标记,标记引用对象
•预清理,清理前准备以及控制停顿时间
•重新标记,修正并发标记数据(STW)
•并发清理
•并发重置

d、CMS 垃圾回收时刻

•达到阈值(默认68%)
•空间不足(标记清理碎片)
e、CMS调优
•-XX:CMSInitatingOccupancyFraction
•内存增长很快,调大参数,减少频繁CMS;反之调小。目的减少回收的次数
•回收过程中、出现串行,调小参数或添加碎片整理
•-XX:UseCMSCompactAtFullCollection&-XX:CMSFullGCsBeforeCompaction
•第一个默认CMS之后进行整理
•第二个设置几次CMS之后进行整理
•-XX:ConGCThreads 或-XX:ParallelCMSThreads
•设置并发回收的线程数
•默认(ParallelGCThreads+3)/4
f、注意:
•CMS过程中产生的垃圾不进行回收
•出现Concurrent mode failure ,表示该进行优化了
二、回收器的组合
[JAVA修炼之路七]-JVM 垃圾回收器_第1张图片
三、回收器所采用算法

[JAVA修炼之路七]-JVM 垃圾回收器_第2张图片

四、各种参数

•1、新生代对象晋升到老年代
•-XX:MaxTenuringThreshold
•新生代对象最大年龄,默认15,15次GC回收之后到老年代。充分非必要条件
•-XX:TargetSurvivorRatio=15
•Survivor默认50%,年龄将按照最小年龄,所以会全部回收到老年代
•大对象大于新生代内存时直接到老年代
•PretenureSizeThreshold
•针对parNew与串行回收器使用,默认为0不起作用
•-XX:-UseTLAB 在tlab上分配以后,上面这个作用会受影响
•2、-XX:+PrintHeapAtGC
•打印堆信息
•3、-XX:-ScavengeBeforeFullGC
•Fullgc 之前执行一次新生代回收。默认为true,System.gc();
•4、-XX:SurvivorRaio
•Eden、suivivor比例
•5、-XX:HeapDumpOnOutMemoryError

你可能感兴趣的:([JAVA修炼之路七]-JVM 垃圾回收器)