数千个线程从Java进程生成。。。为什么?

数千个线程从Java进程生成。。。为什么?,java,multithreading,blockingqueue,Java,Multithreading,Blockingqueue,最近一次客户在运行Java进程时迁移到Linux(64位)时,我遇到了一个问题 该进程正在生成数千个线程,其中大多数线程的标识符为futex。我查过futex(快速用户空间互斥),它是一个实现基本锁定的Linux结构 代码最近已更改为实现BlockingQueue和ExecutorService以生成子线程,但子线程的数量由配置设置控制,我可以证明此特定机制没有失控。我只能假设由于阻塞队列和一些锁,JVM内部的某些东西正在生成所有这些线程 那么,有谁能告诉我如何找出这些线程的实际情况,以及我可以

最近一次客户在运行Java进程时迁移到Linux(64位)时,我遇到了一个问题

该进程正在生成数千个线程,其中大多数线程的标识符为futex。我查过futex(快速用户空间互斥),它是一个实现基本锁定的Linux结构

代码最近已更改为实现BlockingQueue和ExecutorService以生成子线程,但子线程的数量由配置设置控制,我可以证明此特定机制没有失控。我只能假设由于阻塞队列和一些锁,JVM内部的某些东西正在生成所有这些线程

那么,有谁能告诉我如何找出这些线程的实际情况,以及我可以如何控制/停止它们

下面是流程列表的几行;必须终止该进程之前的实际列表长度超过13000行

0-543214474461----5953085-?00:15:50爪哇
0 S 54321--0 82 2--futex_u2;-00:00:00-
1 S 54321--0 82 2--futex_u2;-00:00:00-
1 S 54321--0 82 2--futex_u2;-00:00:00-
1 S 54321--0 82 2--futex_u2;-00:00:00-
1 S 54321--0 82 2--futex_u2;-00:00:00-
1 S 54321--0 82 2--futex_u2;-00:00:00-
1 S 54321--0 82 2--futex_u2;-00:00:00-
1 S 54321--0 82 2--futex_u2;-00:00:00-


非常感谢您的建议。

如果您无法在IDE的调试器中加载应用程序,您可能希望使用VisualVM加载应用程序,以查看线程的实际操作:


确保您可以关闭应用程序,因为它可能会因为线程数量太多而耗尽资源(即在linux中,准备好一个shell)。

如果您无法在IDE的调试器中加载应用程序,您可能希望使用VisualVM加载应用程序,以查看线程的实际操作:


确保您可以终止应用程序,因为它可能会因为线程数量太多而耗尽资源(即在linux中,准备好一个shell)。

您可以进行线程转储吗?BlockingQueue和Lock不会创建线程或导致创建更多线程。只有配置错误的ExecutorService才能执行此操作或创建线程的循环。您使用的是哪个版本的JVM?我曾有同事在Windows下使用64位JVM时遇到问题,它会消耗所有系统资源,这是JVM中的一个明显缺陷。如果相同的代码在32位以下确实会导致问题,那么可能是64位JVM问题。您可以进行线程转储吗?BlockingQueue和Lock不会创建线程或导致创建更多线程。只有配置错误的ExecutorService才能执行此操作或创建线程的循环。您使用的是哪个版本的JVM?我曾有同事在Windows下使用64位JVM时遇到问题,它会消耗所有系统资源,这是JVM中的一个明显缺陷。如果相同的代码在32位以下确实会导致问题,则可能是64位JVM问题。