记第一次JVM性能调优(二)之MinorGC

jvm性能优化

  • GC调优
    • GC调优原则
    • GC调优的目的
    • 调优实战

GC调优

GC调优原则

就我个人的理解而言,对于一个应用程序来说,应当存在四点调优原则

  1. 大多数的java应用都不需要GC调优
  2. 大部分需要GC优化的,不是参数问题,而是代码问题
  3. 优化代码带来的性能提升远远大于参数调整
  4. GC调优应当是程序优化的最后手段

GC调优的目的

  1. 使GC的时间足够小.这个没有硬性的时间值,可以根据项目的不同而自由设定.这里笔者给出一个参考系的指标:Minor GC执行时间不到50ms,Full GC执行时间不到1S
  2. 使GC的次数足够小.同GC时间类似,这里给出参考系指标,Minor GC执行不频繁,大于10S一次,Full GC执行也不算频繁,大于10分钟一次.

调优实战

在性能调优实战一中我们已经解决了FullGC的问题,实际上在我们增大堆内存空间的时候,已经同时明显的减少了MinorGC的次数,调整后的MinorGC次数为13次,如下图:
记第一次JVM性能调优(二)之MinorGC_第1张图片
记第一次JVM性能调优(二)之MinorGC_第2张图片
不过即使MinorGC次数有了明显的减少,仍然没有达到我们预期的调优目标,所以我们接着调整.
在调优之前我们应当明白的是,发生MinorGC的原因是因为新生代的空间不够了,这个时候就会有对象进入老年代,同时也会发生MinorGC.这里我们就修改新生代在堆中所占的比例,上一章中我们给新生代分配的大小为 -Xmn580m 580M,这里我们直接修改为900M.也就是在堆空间大小为1024M的情况下,将新生代设置为900M
记第一次JVM性能调优(二)之MinorGC_第3张图片
增加新生代的比重后确实有一定效果,大约发生了6-7次MinorGC,如果说内存比较吃紧的话,到这里其实也就勉强差不多了,如果内存充足,我们可以考虑取消掉堆最大空间的限制,然后给新生代直接分配1900M,堆初始空间为2200m,运行结果如下
记第一次JVM性能调优(二)之MinorGC_第4张图片
可以看到图中有三次MinorGC,其实在我们增加了如此多的内存空间之后,得到的收益已经没有很大了.这也正是作者在GC调优原则中所说的优化代码带来的性能提升远远大于参数调整,当然作者给定的参数肯定不是一个最优解,其实JVM调优本身就是一个逐步试探的过程,在实际生产中,有些项目并不能重启服务器,这个时候我们也就需要配合一些JVM的命令一起使用,这里就不过多的的阐述了.

你可能感兴趣的:(JVM)