代码之家  ›  专栏  ›  技术社区  ›  Artanis Zeratul

Springboot增加线程,即使server.tomcat.max threads=5

  •  0
  • Artanis Zeratul  · 技术社区  · 6 年前

    我现在有一个springboot应用程序,即使服务器空闲,线程也会不断增加。随着时间的推移,这会导致机器崩溃。导致非常高的内存和CPU使用率。

    我尝试设置server.tomcat.max threads=5,但我非常不走运,线程数一直在上升。

    顺便说一下,这些是我的组件: -Rest模板 -OK HTTP -Hikari CP -HttpInterceptor(请求和传出) -Hibernate/JPA

    JNI PID/TID可以获得htop的轻量级进程ID。因此,这个JNI可以虚拟地映射LWPID和java线程。


    阿塔尼斯·泽拉图尔

    2 回复  |  直到 6 年前
        1
  •  0
  •   chubbsondubs    6 年前

    所以我打赌tomcat只有5个线程,而服务器中的一些其他技术正在创建这些额外的线程。现在,tomcat遵循其线程的命名方案。通常,这5个线程的名称如下:

    http-bio-8080-exec-1
    http-bio-8080-exec-2
    http-bio-8080-exec-3
    ...
    

    你明白了。因此,如果您列出VM中线程的名称(windows上的ctrl-page break,linux上的kill-3 JAVA_PID,jconsole),这可能是您最好的选择。您应该只看到1-5的线程命名模式。所有其他线程都属于其他线程。Tomcat在exec线程之外还有额外的线程,但它们的数量是固定的(停止线程、主线程等)。

        2
  •  0
  •   Artanis Zeratul    6 年前

    我的问题现在解决了。
    这些是我观察到的情况,也是问题的根源。

    首先,我为我所做的每个查询创建了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


    最后,我没有在每次查询或连接数据库时调用Connection.close()。
    这也会导致线程没有终止或关闭。

    参考: Getting Database connection in pure JPA setup



    干杯