原文网址:JVM调优--经验总结_IT利刃出鞘的博客-CSDN博客
简介
本文介绍JVM调优的一些常用经验。
正常的GC频率及时间
GC耗时太长、GC次数太多会影响进程的性能,导致进程响应变慢,或者无法响应。
正常的GC频率
正常的频率
YGC:10秒1次。
FGC:1天1次以内。
频率的优化
YGC的频率优化
- 如果YoungGC频率远低于这个值,例如20秒1次,30秒1次,甚至60秒1次。这种情况下,JVM相当空闲,处于基本上无事可做的状态。建议缩容,减少服务器浪费;
- 如果YoungGC频率远低于这个值,例如1秒/次,甚至1秒/好多次。这种情况下,JVM相当繁忙,建议按照如下步骤进行初步症断:
- 检查Young区,Young区在整个堆占比在25%~40%比较合理,如果Young区太小,建议扩大Xmn。
- 检查SurvivorRatio,保持默认值8即可,Eden:S0:S1=8:1:1是一个比较合理的值;
正常的GC时间
YGC:100ms以内
FGC:1秒以内
频繁FGC 的常见原因
- 大对象
- 系统一次性加载了过多数据到内存中(比如SQL查询未做分页),导致大对象进入了老年代。
- 内存泄漏
- 频繁创建了大量对象,但是无法被回收(比如IO对象使用完后未调用close方法释放资源),先引发FGC,最后导致OOM.
- 程序频繁生成一些长生命周期的对象
- 当这些对象的存活年龄超过分代年龄时便会进入老年代,最后引发FGC. (即本文中的案例)
- 程序BUG
- 程序BUG导致动态生成了很多新类,使得 Metaspace 不断被占用,先引发FGC,最后导致OOM. 代码中显式调用了gc方法,包括自己的代码甚至框架中的代码。
- JVM参数设置问题
- 包括总内存大小、新生代和老年代的大小、Eden区和S区的大小、元空间大小、垃圾回收算法等等。