我现在有一个springboot应用程序,即使服务器空闲,线程仍在继续增加。随着时间的推移,这将导致机器崩溃。导致很高的内存和CPU使用率。
我尝试设置server.tomcat.max-threads = 5,但是我很不幸,线程不断增加。
顺便说一下,这些是我的组件: -休息模板 -确定HTTP -光ika CP -Springboot和Spring Framework(@RestController和@Service) -HttpInterceptor(请求和传出) -休眠/ JPA
我也在使用htop和我创建的JNI计数线程。 JNI PID / TID可以获取htop的轻量级进程ID。因此,此JNI可以虚拟地映射该LWPID和Java线程。
任何帮助将不胜感激。
谢谢,
Artanis Zeratul
答案 0 :(得分:0)
所以我敢打赌,tomcat只有5个线程,而服务器中的其他一些技术正在创建这些额外的线程。现在,tomcat遵循其线程的命名方案。通常,这5个线程的命名如下:
http-bio-8080-exec-1
http-bio-8080-exec-2
http-bio-8080-exec-3
...
您得到图片。因此,如果您列出虚拟机中的线程名称(在Windows上为ctrl-page-break,在Linux上杀死-3 JAVA_PID,jconsole-可能是最好的选择。您应该只看到1-5的线程命名模式。所有其他线程将归其他所有。Tomcat的确比exec线程多了一些额外的线程,但是它们是固定数量的(停止线程,主线程等)。
答案 1 :(得分:0)
我的问题现在解决了。
这些是我观察到的事情,也是问题的根本原因。
首先,我为我进行的每个查询创建了Hikari线程池和本地实体管理器工厂Bean,这些查询在应用程序的生命周期中应该只执行一次,或者对于每个数据源连接都应该执行一次。这是线程不断产生的主要原因。线程池/ LocalEntityManagerFactoryBean的创建与此代码段有关:
HikariDataSource connectionPoolDatasource = new HikariDataSource(connectionPoolConfig);
localContainerEntityManagerFactoryBean.setDataSource(connectionPoolDatasource);
localContainerEntityManagerFactoryBean.setJpaProperties(jpaProperties);
localContainerEntityManagerFactoryBean.afterPropertiesSet();
参考:https://groups.google.com/forum/#!topic/hikari-cp/IsVEn-D6oFA
参见Brett Wooldridge对钟仁明的回应。
最后,我每次查询或连接到数据库时都没有调用Connection.close()。
这也导致线程没有被终止或关闭。
以及保持数据库连接打开。
参考:Getting Database connection in pure JPA setup
干杯!