欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

记第一次JVM性能调优(一)之Full GC优化

程序员文章站 2022-04-16 10:01:30
...

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分钟一次.

调优实战

现有一个公司的项目,项目启动前添加参数 -XX:+PrintGCDetails ,该参数含义为打印GC日志.项目启动时打印日志为:
记第一次JVM性能调优(一)之Full GC优化
记第一次JVM性能调优(一)之Full GC优化
记第一次JVM性能调优(一)之Full GC优化
记第一次JVM性能调优(一)之Full GC优化
从这四张图片可以看到,总共发生了4次Full GC,而Full GC也正是我们在GC调优时需要优先优化的,这四次Full GC给到的信息都是 Metadata GC Threshold其大概意思就是元空间内存不够了导致了GC,在FULL GC错误信息中有这么一条日志:记第一次JVM性能调优(一)之Full GC优化
可以看出初始空间大约为57M,我们尝试给到参数 -XX:MetaspaceSize:126m ,其含义为元空间大小为126M,重启服务器可以明显看到因元空间内存不足导致的Full GC已经没有了,这里就不单独上图片展示,但是出现了另一种Full GC :
记第一次JVM性能调优(一)之Full GC优化
这个GC信息的含义是HotSpot自动选择和调优引发了FullGC,对比Minor GC可以看到,新生代的空间并没有增加,还是493568K,而堆的总空间由581120K变为了617472K,所以在这里作出一个猜想===>老年代空间不足导致GC,因为本人本身电脑内存空间不大,所以这里很屌丝的给堆空间分配为1024m,而新生代分配初始大小为580m,有一个参考公式(493568K/1024 * 2 = 578.4m) .具体参数为:1. 堆初始大小,2. 堆最大大小,3. 新生代大小

 -Xms1024m 
 -Xmx1024m 
 -Xmn580m

一般来说的话,堆的最大空间一般不做限制,方便其做一个扩展.这里我限制为1024的原因是我的电脑内存比较吃紧0.0.现在我们重启tomcat…
记第一次JVM性能调优(一)之Full GC优化
从图中我们可以看到,项目启动时已经没有发生Full GC了.下一节记第一次JVM性能调优(二).我们将讲一讲如何堆Minor GC进行优化.

相关标签: JVM 性能调优