0

我已经定义了一个最大线程数 = 16 的工作管理器,它不是可增长的。但是,在日志中我可以看到线程编号高达 180+。

[WorkManager.Transformer : 180]
[WorkManager.Transformer : 181]
[WorkManager.Transformer : 182]
[WorkManager.Transformer : 183]

我怀疑由于这个原因,线程正在等待资源并在 180 秒后抛出 JDBC ConnectionWaitTimeoutException。

当最大限制设置为 16 时,为什么会产生这么多线程。我还能检查什么?

4

1 回答 1

2

线程索引是在服务器的生命周期内为该线程池创建的总线程数,它不一定表示当前有多少线程处于活动状态。如果池的最小值和最大值不相同,则池将在一段时间未使用后将线程删除到其配置的最小值,然后如果需求上升到该最小值以上,则创建新线程。新创建线程的索引只是下一个尚未使用的数字。

例如,如果您有一个最小大小为 1 和最大大小为 5 的池,并且您同时向它分派五个工作项,它将创建名称为“Pool : 0”到“Pool : 4”的线程。当这些工作项目完成时,在经过一段时间后,除了其中一个之外,所有项目都将被删除,具体由最小池大小指定。如果再次将五个工作项分派到池中,将创建四个名为“Pool : 5”到“Pool : 8”的线程,但即使最高索引号为 8,您也只有 5 个活动线程。

如果您担心实际情况并非如此,您可以从进程中收集一个 javacore(kill -3 <pid>或通过服务器的管理控制台请求它)并简单地计算名称中带有“WorkManager.Transformer”的线程数 - 我我猜它会是 16 或更少。javacore 在确定导致资源问题的原因方面也很有用,因为您将能够看到线程堆栈以及它们正在等待的任何锁或其他资源。

于 2021-07-19T13:20:57.850 回答