JVM虚拟机---性能调优

1、调优策略

     对于GC的性能主要有2个方面的指标:吞吐量throughput(工做时间不算gc的时间占总的时间比)和暂停pause(gc发生时app对外显示的没法响应)。java

一、调优的目的

  调优的最终目的固然增大吞吐量,减小暂停时间咯,映射到GC层面主要关心下面这两点:程序员

      (1)将转移到老年代的对象数量下降到最小。算法

      (2)减小full GC的执行时间。(尽可能减小GC的次数)并发

那什么状况对象会转移到老年代,主要有这四种:app

    (1)新生代对象每经历依次minor gc,年龄会加一,当达到年龄阀值会直接进入老年代。阀值大小通常为15。工具

    (2)Survivor空间中年龄全部对象大小的总和大于survivor空间的一半,年龄大于或等于该年龄的对象就能够直接进入老年代,而无需等到年龄阀值。性能

    (3)大对象直接进入老年代。优化

    (4)新生代复制算法须要一个survivor区进行轮换备份,若是出现大量对象在minor gc后仍然存活的状况时,就须要老年代进行分配担保,让survivor没法容纳的对象直接进入老年代。网站

再来分析为何说要减小full GC时间次数,那得先看GC的两大分类spa

   Partial GC:并不收集整个GC堆的模式

                Young GC:只收集young gen的GC

                 Old GC:只收集old gen的GC。只有CMS的concurrent collection是这个模式

                Mixed GC:收集整个young gen以及部分old gen的GC。只有G1有这个模式

  Full GC:针对整个新生代、老生代、元空间(metaspace,java8以上版本取代perm gen)的全局范围的GC。这里就明白为何要减小Full GC的次数了。

通常Full GC所花费的时间是Young GC的十倍。

二、哪些方面能够考虑调优?

为了达到上面的目的,通常地,你能够考虑调优的有:

(1)减小使用全局变量和大对象。

(2)新生代和老年代的大小是否合适。

(3)新生代和老年代所占的比例是否合适。

(4)幸存者区和新生区所占的比例到是否合适。

(5)选择合适的GC收集器。

三、什么状况说明GC已经不错了呢?

此外,若是GC执行时间知足下列全部条件,就没有必要进行GC优化了:

     Minor GC执行很是迅速(50ms之内)

     Minor GC没有频繁执行(大约10s执行一次)

     Full GC执行很是迅速(1s之内)

     Full GC没有频繁执行(大约10min执行一次)

括号中的数字并非绝对的,它们也随着服务的状态而变化。

 

2、调优经验(规则)

这些规则,通常是你们比较建议的,能够做为初始配置的时候进行配置建议,固然具体的还得经过JVM工具监测来具体分析。

    (1) -Xmx 和-Xms 通常设置为同样大小。这样能稍微提升GC的运行效率,由于他/她再也不须要估算堆是否须要调整大小了。

    (2)官方推荐新生代占堆的3/8。

    (3)幸存代占新生代的1/10。

    (4)垃圾收集器若是内存比较大建议G1收集器,固然也能够用CMS收集器。

    (5)-XX:+DisableExplicitGC禁止System.gc(),省得程序员误调用gc方法影响性能;

    (6)吞吐量优先的应用:通常吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代.缘由是,这样能够尽量回收掉大部分短时间对象,减小中期的对象,而年老代尽存放长期存活对象.

    (7)采用并发回收时,年轻代小一点,年老代要大,由于年老大用的是并发回收,即便时间长点也不会影响其余程序继续运行,网站不会停顿.

    (8)使用CMS的好处是用尽可能少的新生代, 而后老生代利用CMS并行收集, 这样能保证系统低延迟的吞吐效率。

下面附上进行JVM的优化的一些参数:

复制代码
-Xmx300m                        最大堆大小
-Xms300m                       初始堆大小
-Xmn100m                        年轻代大小
-XX:SurvivorRatio=8             Eden区与Survivor区的大小比值,设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10

-XX:+UseG1GC                    使用 G1 (Garbage First) 垃圾收集器    
-XX:MaxTenuringThreshold=14        提高年老代的最大临界值(tenuring threshold). 默认值为 15[每次GC,增长1岁,到15岁若是还要存活,放入Old区]
-XX:ParallelGCThreads=8            设置垃圾收集器在并行阶段使用的线程数[通常设置为本机CPU线程数相等,即本机同时能够处理的个数,设置过大也没有用]
-XX:ConcGCThreads=8              并发垃圾收集器使用的线程数量


-XX:+DisableExplicitGC       禁止在启动期间显式调用System.gc()


-XX:+HeapDumpOnOutOfMemoryError   OOM时导出堆到文件
-XX:HeapDumpPath=d:/a.dump        导出OOM的路径
-XX:+PrintGCDetails              打印GC详细信息
-XX:+PrintGCTimeStamps            打印CG发生的时间戳
-XX:+PrintHeapAtGC               每一次GC前和GC后,都打印堆信息
-XX:+TraceClassLoading            监控类的加载
-XX:+PrintClassHistogram          按下Ctrl+Break后,打印类的信息
复制代码
相关文章
相关标签/搜索