生产问题记录:堆内存溢出导致httpclient不可用

431 阅读1分钟

环境

一个服务用于推送客户的记录,客户反馈记录没有被推送到目标服务,通过管理发现所有的记录状态都为推送中。

现象

业务服务日志信息:

image.png

定位错误源码,发现是httpclient.isRunning()方法返回false。

image.png

通过start()方法定位到初始化的类,发现在处理异常的时候会抛出 I/O reactor terminated abnormally,然后把httpclient的Status设置成STOPPED,最终导致报错。

image.png

查询日志定位是否有这个错误信息,还真的找到了,打印上下文发现了FastJson抛出的OOM。

image.png

启动参数加上打印GC的参数,同时把原本的内存从512M调整到1024M,观察GC日志打印;发现metaspace用的默认,会频繁触发Full GC, 我认为需要调整大一些,改到了128M,后面在根据实际情况调整。

image.png

结论:还是重启比较简单见效快