1. GC策略调整参数
No. | 参数名称 | 年轻代GC效果 | 老年代与元空间GC效果 |
---|---|---|---|
01 | -XX:+UseSerialGC | 串行GC(Serial Copying) | 串行GC(Serial MSC) |
02 | -XX:+UseParallelGC | 并行回收GC(Parallel Scavenge) | 并行GC(Parallel Mark Sweep、Parallel Compacting) |
03 | -XX:+UseConcMarkSweepGC | 并行GC(ParNew) | 并行GC(Concurrent Mark-Sweep GC、CMS GC),当出现Concurrent Mode Failure时采用串行GC(Serial MSC) |
04 | -XX:+UseParNewGC | 并行GC(ParNew) | 串行GC(Serial MSC) |
05 | -XX:+UseParallelOldGC | 并行回收GC(Parallel Scavenge) | 并行GC(Parallel Mark Sweep、Parallel Compacting) |
2. 收集器参数设置
No. | 参数名称 | 描述 |
---|---|---|
01 | -XX:ParallelGCThreads=n | 设置并行收集器操作使用的CPU数量 |
02 | -XX:MaxGCPauseMillis=n | 设置并行收集器的最大暂停时间,单位为“毫秒” |
03 | -XX:GCTimeRatio=n | 设置垃圾回收时间占程序运行时间的百分比 |
04 | -XX:+CMSIncrementalMode | 设置为增量模式,适合单CPU模式,需要使用“-XX:UseConcMarkSweepGC”策略 |
3. 范例
1. 查看可用CPU数量
-
测试程序
public class TestDemo { public static void main(String[] args) { System.out.println(Runtime.getRuntime().availableProcessors()); }}
-
终端命令
> javac TestDemo.java> java TestDemo
2. 查看默认GC策略
-
测试程序
public class TestDemo { public static void main(String[] args) { String str = "www.shadowolf.cn"; while (true) { str += str + str; str.intern(); } }}
-
终端命令
> javac TestDemo.java> java -Xmx10m -Xms10m -XX:+PrintGCDetails TestDemo
-
部分结果
[Full GC (Ergonomics) [PSYoungGen: 1638K->0K(2560K)] [ParOldGen: 6973K->2473K(7168K)] 8611K->2473K(9728K), [Metaspace: 2553K->2553K(1056768K)], 0.0055640 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
- 年轻代使用的是并行回收GC策略,老年代使用的是并行GC策略。
3. 使用串行回收GC策略
-
终端命令
> java -Xmx10m -Xms10m -XX:+UseSerialGC -XX:+PrintGCDetails TestDemo
-
部分结果
[GC (Allocation Failure) [DefNew: 1899K->1899K(3072K), 0.0002518 secs] [Tenured: 6267K->2473K(6848K), 0.0024667 secs] 8167K->2473K(9920K), [Metaspace: 2554K->2554K(1056768K)], 0.0030796 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
- 单线程下运行,串行GC。
4. 使用并行GC策略
-
终端命令
> java -Xmx10m -Xms10m -XX:+UseParallelGC -XX:+PrintGCDetails TestDemo
-
部分结果
[Full GC (Ergonomics) [PSYoungGen: 1614K->0K(2560K)] [ParOldGen: 6921K->2473K(7168K)] 8535K->2473K(9728K), [Metaspace: 2553K->2553K(1056768K)], 0.0042757 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
- 年轻代使用并行回收GC策略
- 老年代使用并行GC策略
5. 使用CMS回收
-
终端命令
> java -Xmx10m -Xms10m -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails TestDemo
-
可以看到CMS流程
CMS Initial MarkCMS-concurrent-markCMS-concurrent-precleanCMS Final RemarkCMS-concurrent-sweepCMS-concurrent-reset
-
部分结果
[GC (Allocation Failure) [ParNew: 1906K->1906K(3072K), 0.0001484 secs] [CMS (concurrent mode failure): 6280K->2477K(6848K), 0.0030195 secs] 8186K->2477K(9920K), [Metaspace: 2553K->2553K(1056768K)], 0.0035527 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
- 如果使用CMS的处理操作,则年轻代使用传统的并行GC回收策略,而老年代使用CMS,这样整个程序的暂停时间会非常短暂,适合于响应速度快的程序运行。
4. 总结
-
如果程序没有特别速度要求的话,建议使用默认的GC策略。
-
以上的GC策略都属于最为原始的GC策略,所有的GC策略都有一个问题:都需要扫描全部子内存空间。