背景:
公司开发了一款边缘计算的平台,技术上采用了sping-boot2.x版本+gradle,redis客户端采用了lettuce5.4版本。Linux上边缘计算平台集成相机时,发现缓冲区内存溢出。
调查:
出现了缓冲区内存溢出,在windows本地环境发现同样的流程未复现Linux环境上的问题,debug模式下由于相机的sdk调用复杂,涉及c底层,查看不出原由。
模拟测试:
设计测试方案,一、使用接口单独调用相机sdk未能发现问题。二、在调用相机的sdk基础上,加上流程附近的操作。
测试结果得出,redis与相机sdk一起使用时出现问题。
网上查看类似问题:
1、c底层本身的问题,大概类似数组越界,申请的内存不够之类。
2、redis的客户端lettuce的netty的内存超过默认的最大内存。
验证是否是上述问题:
问题一未能模拟,问题二代码里面加上了对netty内存使用情况的监控,发现未超过默认的最大内存。
问题暂时解决:
网上说可以使用jedis替换调lettuce,于是进行替换,测试发现问题消失。
但是在全项目进行替换发现由于公司采取的技术框架比较与众不同,替换不能采用网上所说的形式。
spring-boot2.x版本+gradle加载依赖项目替换redis客户端为jedis方式:
1、排除lettuce依赖:
由于公司的spring-boot是通过spring的插件导入,不能直接在spring导入依赖中添加排除,只能在全局设置排除依赖。
exclude g