线上FGC问题排查与解决

一、GC相关参数

-Xms设置堆的最小空间大小。
-Xmx设置堆的最大空间大小。
-XX:NewSize设置新生代最小空间大小。
-XX:MaxNewSize设置新生代最大空间大小。
-XX:PermSize设置永久代最小空间大小。
-XX:MaxPermSize设置永久代最大空间大小。
-Xss设置每个线程的堆栈大小。

二、通过General查看JVM监控大屏

 三、监控分析

  由此图可以看出FGC最快以每4小时回收一次(回收频繁,回收完之后内存很快又满了,导致FGC回收)
  可能的原因:FGC 能正常回收到内存
  通过监控或GC日志,我们能看到每次FGC后都能正常回收到内存,但是内存很快又被占满,导致又出现FGC,从而出现FGC频繁。
  这个场景通常可能由于两个原因导致:
  • Eden 区配置太小,导致大量对象直接进入老年代,从而导致老年代快速被占满。
  • 业务量较大,特别是在业务高峰期。而当前的服务器配置已经无法满足当前的业务量。
  对于这两个原因,代码本身可能没有大问题,优先采取扩容机器,降低单台服务器压力即可解决。后续则需要重新评估当前服务器的配置是否满足当前的业务量,JVM参数是否存在优化空间等等。

四、查看线上环境JVM配置

查看命令:ps -ef|grep java

 

  -XX:MaxMetaspaceSize=384M内存太小,导致MetaspaceSize容量触发FGC的阈值。比如-XX:MetaspaceSize=384M,当MetaspaceSize容量超过384M时触发FGC,超过设定阈值后MetaspaceSize每扩容一次触发一次FGC
  结论分析:该场景是由于业务量增大没有及时评估或者JVM参数配置存在问题导致的,整体来说,出现的概率较小。

posted @ 2023-06-13 15:33  IM-Fly  阅读(89)  评论(0)    收藏  举报