springboot1.5版本 - 使用restTmplate漏洞问题

【系统背景】

系统采用了springcloud Dalston.SR3版本, springboot为1.5.4.RELEASE版本,  进行微服务的开发及管理。

【问题现象】

应用不定期出现内存占用较高、CPU使用率高,内存占满后一直无法释放。

查询后台日志存在警告日志: WARN o.s.cloud.netflix.metrics.servo.ServoMonitorCache [57]- timerCache is above the warning threshold of 1000 with size 511487
使用jmap -histo pid 命令查看堆内存使用情况,发现大量对象实例未被及时回收(大量对象实例被创建且未及时释放掉)

 num     #instances         #bytes          class name
----------------------------------------------
   1:      10892148      261411552        java.util.concurrent.atomic.AtomicLong
   2:       4082727       108873888        [Ljava.util.concurrent.atomic.AtomicLong;

 

【逻辑调查】

springboot1.5版本 - 使用restTmplate漏洞问题

springboot1.5版本 - 使用restTmplate漏洞问题

上述截图翻译为 “拦截restemplate请求并记录有关执行时间和结果的度量”

springboot1.5版本 - 使用restTmplate漏洞问题

在ServoMetricsAutoConfiguration 配置类中,spring.metrics.servo.enabled默认为true

springboot1.5版本 - 使用restTmplate漏洞问题

发现上述springboot1.5版本 - 使用restTmplate漏洞问题;这行一直在往map里边put,导致map过大触发了上图第54行逻辑,并打印了告警日志,所以这部分的内存一直得不到释放,可能导致内存泄漏

【解决方案】

解决思路: 升级springboot版本或者关闭spring.metrics.servo.enabled=false;

其中升级springboot版本,涉及范围比较大,springcloud也要同时进行升级。 

最终选择了后者在 yml配置文件中增加 spring.metrics.servo.enabled=false;搞定