解决使用org.eclipse.paho.client.mqttv3连接mqtt导致内存溢出的bug
服务器发现数据处理较慢,查看日志发现内存溢出
并且看到服务器上使用命令会出现
fork: retry: 资源暂时不可用
并且结合服务占用内存较大推断是服务在一直创建线程,导致服务器最大线程数超过了系统默认设置
这时候jstack发现mqtt一直在创建线程,并且没有通过线程池创建线,这里图截不到了,就类似于通过new Thread()创建线程,导致占满了服务器线程数
那么问题定位到了,就是mqtt在一直创建线程,创建完成立即休眠
原因分析:
提示:分析应该是mqtt连接出现的问题,于是查看连接代码
发现调用的构造方法是没传线程池的构造
且官方说明这个构造没有使用线程池
所以连接的时候如果遇到异常,会一直new Thread()出来
解决方案:
- 调用有线程池的构造方法
- 连接失败的时候调用close()方法