记一次ssl方式导致的堆外内存泄露

在巡检的时候突然发现现网某业务使用内存大约6G,问题是我们配置的-Xmx=2G,metaspace没配置,从GC日志看

第一次提交的最大metaspace为1G,假设都使用了,堆外内存最小也有3G了
定位步骤
1.查看/proc/${pid}/smaps文件(pmap命令也类似)
发现20来个65536KB的块

记一次ssl方式导致的堆外内存泄露_第1张图片

而且连续观察到64M块和内存增长量也符合,搜到案例  http://blog.11034.org/2016-09/64bits_linux_arena_memory.html ,预计可以解决;

2.那么这些65536的块里内容是啥呢?
现网业务暂时还没挂,缓慢增长中,看测试环境有类似问题,果断core一个文件下来看看
gdb后
attach xxx
gcore core.xxx
detach
然后就生成了core.xxx文件,然后 gdb -core core.xxx ,
x/1000s 0x7f75b0000000  (其中7f75b0000000为smap中的起始地址)

然后能够看到很多证书相关内容

想到最近版本修改CSE的ssl方式为openssl,于是去掉ssl方式修改为jdk方式,现网重启,观察一天后问题修复

后续直接联系cse的开发,经过他测试确认,netty-tcnative-boringssl-static-2.0.7.Final.jar版本有bug,后续需要升级cse解决。

这次问题比较麻烦的地方有2个:

1.现网几乎所有微服务内存缓慢增长,测试环境只有2个微服务有问题,而且运行了2周才出现,修改参数重启的方式,在测试环境上没法验证

2.现网内存虽然在增加,但是没挂,也就没堆栈可以看,庆幸有gdb搞一把保存了现场看内容

你可能感兴趣的:(Java行进中)