晚上集中发版时遇到nacos老年代暂满,导致频繁进行full gc,但gc后内存无法降下来。目前有4台机器,每台16核32GB内存,其中老年代分配了10GB。有没有遇到过这种情况的经验分享?另外每个nacos服务内存都分配了20GB,其中年轻代10GB,老年代10GB,总内存为80GB,我的主要问题出现在集中发版时,老年代的内存回收不彻底,发版完成后,情况恢复正常了。
升级下jdk.垃圾回收的更完美,用jdk11.线程数量.gc性能 优化的都还不错 1、你可以看一下你server节点长轮询连接数是否很不均衡。
2、我之前遇到的server内存泄漏,是因为/nacos/v1/cs/configs/listener这个长轮询接口在服务端的对象被强引这释放不了。
3、扩大server内存,升级客户端到2.x。。此回答整理自钉钉群:Nacos社区群(1群满,请加4群:12810027056)。
您好,根据您的描述,我理解您在集中发版时遇到了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。
根据您的描述,Nacos 在集中发版时遇到老年代暂满,并且频繁进行 Full GC,但是 GC 后内存没有降下来。以下是一些可能的原因和解决方案:
调整堆内存分配:您提到每个 Nacos 服务都分配了 20GB 内存,其中年轻代和老年代各占用了 10GB。在集中发版期间,由于大量对象被创建和销毁,老年代可能会出现内存不足的情况。建议适当增加老年代的内存分配,例如将老年代调整为 12GB 或更多。
调整 GC 算法和参数:根据您的内存配置,您可以考虑采用不同的垃圾收集算法和调整相应的参数。例如,可以尝试使用 G1 垃圾收集器,并调整相关的参数,如 -XX:MaxGCPauseMillis
、-XX:G1HeapRegionSize
等,以更好地适应大内存配置和集中发版的场景。
增加服务器数量或分布式部署:如果可能的话,可以考虑增加服务器数量或进行分布式部署。这样可以分散压力并提高整体性能和可伸缩性。
检查代码质量和资源泄漏:集中发版时可能会导致资源的过度创建和使用,因此请确保代码质量良好,并仔细检查是否存在资源泄漏的情况。
监控和调优工具:使用适当的监控和调优工具,例如 JDK 的 jstat、jconsole、VisualVM 等,来分析内存使用情况和 GC 行为,以便更好地了解问题所在并进行相应的调整。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。