回答
执行过于频繁是没有一个特定的标准的,它跟应用服务器的各项指标、应用的负载都存在一定的关系。大明哥认为一台 4C8G 的服务器,Young GC 的执行频率应该在 8 ~10 秒,即一分钟执行 10 次左右都属于正常现象。如果2 ~ 3 秒就执行一次,则是过于频繁。
Young GC 执行过于频繁无外乎两个原因:
- 应用程序创建对象过快
- 新生代内存设置太小
如果新生代内存的设置问题,则可以通过调整 -Xmn
、-XX:SurvivorRatio
等参数设置来解决问题。如果参数设置正常,则就需要借助一些工具(如 MAT)来分析 dump 文件进一步排查。在排查过程着重关于排名前几的 Java 对象。
扩展
直接看 GC log 是很费神,而且还不直观,大明哥推荐一款超级好用的 GC日志可视化分析工具 GCeasy
,通过它,我们可以很方便地看到JVM各个分代的内存使用情况、垃圾回收次数、垃圾回收的原因、垃圾回收占用的时间、吞吐量等,这些指标在我们进行JVM调优、分析 JVM 日志的时候非常有用。
具体使用方法可以阅读下面这篇文章: