即使server.tomcat.max-threads = 5

时间:2018-12-07 13:27:32

标签: multithreading spring-boot tomcat

我现在有一个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

2 个答案:

答案 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



干杯!