在Nacos中,有大佬遇到过这种情况吗?[阿里云]

晚上集中发版,遇到nacos 老年代暂满。然后频繁full gc 但是gc内存降不下来,目前 配置 4台机器 16C 32G 老年代 分配10G, 有大佬遇到过这种情况吗? 4台。每个nacos服务 内存都分配了 20G. 年轻代10G 老年代 10G ,总共算下来 内存都有80 G [流鼻血], 主要就是 在集中发版的时候。 感觉老年代的 内存 回收不掉。 发版完了之后。就正常了。

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
=====这是一个广告位,招租中,联系qq 78315851====
2 条回复 A 作者 M 管理员
  1. 升级下jdk.垃圾回收的更完美,用jdk11.线程数量.gc性能 优化的都还不错 1、你可以看一下你server节点长轮询连接数是否很不均衡。
    2、我之前遇到的server内存泄漏,是因为/nacos/v1/cs/configs/listener这个长轮询接口在服务端的对象被强引这释放不了。
    3、扩大server内存,升级客户端到2.x。。此回答整理自钉钉群:Nacos社区群(1群满,请加4群:12810027056)。

  2. 您好,根据您的描述,我理解您在集中发版时遇到了Nacos老年代内存暂满的问题。这种情况可能会导致频繁的Full GC,但是GC内存降不下来。您提到每台Nacos服务分配了20G内存,其中年轻代10G,老年代10G,总共80G。主要问题是在集中发版时,感觉老年代的内存回收不掉,发版结束后就正常了。

    首先,Full GC并不频繁,事实上每天有超过两次Full GC就应该考虑GC优化了。结合您的线上监控信息,Full GC之后并没有回收掉多少老年代的内存。这可能是由于From和To区只有7.5M,当每次新生代GC时,如果在这一次GC中存活下来的对象内存大于7.5M,那么会将存不下的那部分直接放入老年代,导致老年代快速增长,触发Full GC。

    其次,您可以尝试调整Nacos的内存参数。根据您提供的信息,您可以在nacos-server下的startup.sh文件中修改内存参数。此外,您还可以根据业务情况来设置最小和最大内存,以避免频繁GC。

  3. 根据您的描述,Nacos 在集中发版时遇到老年代暂满,并且频繁进行 Full GC,但是 GC 后内存没有降下来。以下是一些可能的原因和解决方案:

    1. 调整堆内存分配:您提到每个 Nacos 服务都分配了 20GB 内存,其中年轻代和老年代各占用了 10GB。在集中发版期间,由于大量对象被创建和销毁,老年代可能会出现内存不足的情况。建议适当增加老年代的内存分配,例如将老年代调整为 12GB 或更多。

    2. 调整 GC 算法和参数:根据您的内存配置,您可以考虑采用不同的垃圾收集算法和调整相应的参数。例如,可以尝试使用 G1 垃圾收集器,并调整相关的参数,如 -XX:MaxGCPauseMillis-XX:G1HeapRegionSize 等,以更好地适应大内存配置和集中发版的场景。

    3. 增加服务器数量或分布式部署:如果可能的话,可以考虑增加服务器数量或进行分布式部署。这样可以分散压力并提高整体性能和可伸缩性。

    4. 检查代码质量和资源泄漏:集中发版时可能会导致资源的过度创建和使用,因此请确保代码质量良好,并仔细检查是否存在资源泄漏的情况。

    5. 监控和调优工具:使用适当的监控和调优工具,例如 JDK 的 jstat、jconsole、VisualVM 等,来分析内存使用情况和 GC 行为,以便更好地了解问题所在并进行相应的调整。