记第一次JVM性能调优(一)之Full GC优化
GC调优
GC调优原则
就我个人的理解而言,对于一个应用程序来说,应当存在四点调优原则
- 大多数的java应用都不需要GC调优
- 大部分需要GC优化的,不是参数问题,而是代码问题
- 优化代码带来的性能提升远远大于参数调整
- GC调优应当是程序优化的最后手段
GC调优的目的
- 使GC的时间足够小.这个没有硬性的时间值,可以根据项目的不同而*设定.这里笔者给出一个参考系的指标:Minor GC执行时间不到50ms,Full GC执行时间不到1S
- 使GC的次数足够小.同GC时间类似,这里给出参考系指标,Minor GC执行不频繁,大于10S一次,Full GC执行也不算频繁,大于10分钟一次.
调优实战
现有一个公司的项目,项目启动前添加参数 -XX:+PrintGCDetails ,该参数含义为打印GC日志.项目启动时打印日志为:
从这四张图片可以看到,总共发生了4次Full GC,而Full GC也正是我们在GC调优时需要优先优化的,这四次Full GC给到的信息都是 Metadata GC Threshold其大概意思就是元空间内存不够了导致了GC,在FULL GC错误信息中有这么一条日志:
可以看出初始空间大约为57M,我们尝试给到参数 -XX:MetaspaceSize:126m ,其含义为元空间大小为126M,重启服务器可以明显看到因元空间内存不足导致的Full GC已经没有了,这里就不单独上图片展示,但是出现了另一种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…
从图中我们可以看到,项目启动时已经没有发生Full GC了.下一节记第一次JVM性能调优(二).我们将讲一讲如何堆Minor GC进行优化.
上一篇: java_成员内部类
下一篇: ## day02总结