正常运行的程序,在web页面突然登录不了,所有接口都超时。
登录服务器发现服务器特别卡,内存爆满,给程序重启了一下。
使用命令 jstack -l <进程id> 命令查看线程状态
发现别多的Thread命名的线程是unirest工具包产生的
通过查找代码原因是:
Unirest使用的是老版本的依赖
<dependency>
<groupId>com.mashape.unirest</groupId>
<artifactId>unirest-java</artifactId>
<version>1.4.9</version>
</dependency>
在方法中使用了Unirest.setTimeouts(0,0)
每次调用方法就会启动一个SyncIdleConnectionMonitorThread的线程类,并且线程不会停止,一直处于wait状态, 最终导致内存溢出的情况
解决方案:
static { Unirest.setTimeouts(60000,60000); }
使用静态代码块全局只加载一次, 又或者放到启动类中随着服务启动进行加载设置.