博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
011. 深入JVM学习—垃圾收集策略配置
阅读量:6084 次
发布时间:2019-06-20

本文共 2821 字,大约阅读时间需要 9 分钟。

hot3.png

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策略都有一个问题:都需要扫描全部子内存空间。

转载于:https://my.oschina.net/shadowolf/blog/1835969

你可能感兴趣的文章
前端基础---jquery练习
查看>>
保持健康,远离疾病
查看>>
如何推断乱码是从何种编码转换到何种编码导致的乱码?
查看>>
Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等
查看>>
【SMTP 补录】
查看>>
zabbix通过External checks的方式自动发现交换机端口(只提取up的)
查看>>
CentOS下配置LAMP
查看>>
Myeclipse报错-->Animation Start An internal error has occurred. java.lang.NullPointerException解决...
查看>>
CSS性能优化
查看>>
C# 流
查看>>
查杀端口进程
查看>>
PHP版本的IP段验证类
查看>>
openstack M版安装 compute(nova)服务篇
查看>>
大学四年你必须做到的事儿---那些学计算机的
查看>>
rlwrap安装
查看>>
【scala初学】scala IDE eclipse
查看>>
VMM2012应用指南之4-向VMM中添加Hyper-V主机与应用服务器
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
perl文件读写
查看>>