我在运行Java进程时最近客户迁移到Linux(64位)时出现问题。
该过程最多产生数千个线程,其标识符为futex。我查找了futex(快速用户空间互斥),它是一个实现基本锁定的Linux构造。
最近更改了代码以实现BlockingQueue和ExecutorService来生成子线程,但子线程的数量由配置设置控制,我可以证明这种特定的机制没有失控。我只能假设JVM内部的东西由于BlockingQueue和一些锁而产生所有这些线程?
所以有人能告诉我如何找出这些线程实际上是什么以及我可以做些什么来控制/阻止它们?
以下是流程列表的几行;必须杀死进程之前的实际列表超过13000行。
0 - 54321 447 446 1 - - - 5953085 - ? 00:15:50 java
0 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
感激地接受任何建议。
答案 0 :(得分:0)
如果无法在IDE的调试器中加载应用程序,则可能需要使用VisualVM加载应用程序以查看线程实际执行的操作:
http://download.oracle.com/javase/6/docs/technotes/guides/visualvm/threads.html
确保你可以杀死应用程序,因为它可能会耗尽资源,因为线程数量很大(例如在linux中,准备好shell)。