数千个线程从Java进程生成。。。为什么?
最近一次客户在运行Java进程时迁移到Linux(64位)时,我遇到了一个问题 该进程正在生成数千个线程,其中大多数线程的标识符为futex。我查过futex(快速用户空间互斥),它是一个实现基本锁定的Linux结构 代码最近已更改为实现BlockingQueue和ExecutorService以生成子线程,但子线程的数量由配置设置控制,我可以证明此特定机制没有失控。我只能假设由于阻塞队列和一些锁,JVM内部的某些东西正在生成所有这些线程 那么,有谁能告诉我如何找出这些线程的实际情况,以及我可以如何控制/停止它们 下面是流程列表的几行;必须终止该进程之前的实际列表长度超过13000行 0-543214474461----5953085-?00:15:50爪哇数千个线程从Java进程生成。。。为什么?,java,multithreading,blockingqueue,Java,Multithreading,Blockingqueue,最近一次客户在运行Java进程时迁移到Linux(64位)时,我遇到了一个问题 该进程正在生成数千个线程,其中大多数线程的标识符为futex。我查过futex(快速用户空间互斥),它是一个实现基本锁定的Linux结构 代码最近已更改为实现BlockingQueue和ExecutorService以生成子线程,但子线程的数量由配置设置控制,我可以证明此特定机制没有失控。我只能假设由于阻塞队列和一些锁,JVM内部的某些东西正在生成所有这些线程 那么,有谁能告诉我如何找出这些线程的实际情况,以及我可以
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问题。