解决使用org.eclipse.paho.client.mqttv3连接mqtt导致内存溢出的bug

解决使用org.eclipse.paho.client.mqttv3连接mqtt导致内存溢出的bug

服务器发现数据处理较慢,查看日志发现内存溢出
解决使用org.eclipse.paho.client.mqttv3连接mqtt导致内存溢出的bug_第1张图片
并且看到服务器上使用命令会出现

fork: retry: 资源暂时不可用

并且结合服务占用内存较大推断是服务在一直创建线程,导致服务器最大线程数超过了系统默认设置

这时候jstack发现mqtt一直在创建线程,并且没有通过线程池创建线,这里图截不到了,就类似于通过new Thread()创建线程,导致占满了服务器线程数

那么问题定位到了,就是mqtt在一直创建线程,创建完成立即休眠

原因分析:

提示:分析应该是mqtt连接出现的问题,于是查看连接代码
解决使用org.eclipse.paho.client.mqttv3连接mqtt导致内存溢出的bug_第2张图片

发现调用的构造方法是没传线程池的构造
解决使用org.eclipse.paho.client.mqttv3连接mqtt导致内存溢出的bug_第3张图片
且官方说明这个构造没有使用线程池解决使用org.eclipse.paho.client.mqttv3连接mqtt导致内存溢出的bug_第4张图片
所以连接的时候如果遇到异常,会一直new Thread()出来
解决使用org.eclipse.paho.client.mqttv3连接mqtt导致内存溢出的bug_第5张图片

解决方案:

  1. 调用有线程池的构造方法
    在这里插入图片描述
  2. 连接失败的时候调用close()方法
    解决使用org.eclipse.paho.client.mqttv3连接mqtt导致内存溢出的bug_第6张图片

你可能感兴趣的:(bug,服务器,java)