Java 应用程序每隔几分钟挂起一次futex_wait_queue_me()

Java 应用程序每隔几分钟挂起一次futex_wait_queue_me(),java,ubuntu,groovy,Java,Ubuntu,Groovy,我正在Ubuntu 11.10机器上用Groovy运行一个简单的脚本,它获取键/值对并将它们添加到循环中的JDBM映射中。每隔3分钟,脚本将挂起几分钟,然后继续。当我查看资源监视器时,我看到没有CPU或内存活动,进程处于futex\u wait\u queue\u me() 请通过应用程序在没有挂起的情况下运行的方式,在Windows计算机上建议克服此问题的方法。 这可能是操作系统的问题吗?(在Ubuntu0中发现了许多关于类似的futex\u wait\u queue\u me()问题的类似线

我正在Ubuntu 11.10机器上用Groovy运行一个简单的脚本,它获取键/值对并将它们添加到循环中的JDBM映射中。
每隔3分钟,脚本将挂起几分钟,然后继续。
当我查看资源监视器时,我看到没有CPU或内存活动,进程处于
futex\u wait\u queue\u me()

请通过应用程序在没有挂起的情况下运行的方式,在Windows计算机上建议克服此问题的方法。
这可能是操作系统的问题吗?(在Ubuntu0中发现了许多关于类似的
futex\u wait\u queue\u me()
问题的类似线程

感谢所有感兴趣的人,我在运行java时使用了这些参数:

-Xms16384M -Xmx16384M

您可以在

上找到其他GC优化提示。请检查内核的版本。我在Centos6上遇到了类似的问题(java和其他多线程应用程序),将内核升级到版本2.6.32-504.16.2.el6.x86_64解决了此问题

请参阅centos错误报告:其中包含指向问题解释的指针: [^]

我的跟踪是:

cat /proc/23199/stack
[<ffffffff810b226a>] futex_wait_queue_me+0xba/0xf0
[<ffffffff810b33a0>] futex_wait+0x1c0/0x310
[<ffffffff810b4c91>] do_futex+0x121/0xae0
[<ffffffff810b56cb>] sys_futex+0x7b/0x170
[<ffffffff8100b072>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff
cat/proc/23199/stack
[]futex_wait_queue_me+0xba/0xf0
[]futex_等待+0x1c0/0x310
[]do_futex+0x121/0xae0
[]sys_futex+0x7b/0x170
[]系统调用快速路径+0x16/0x1b
[]0xFFFFFFFFFFFFFF

您是否可以提供等待线程的完整线程转储,例如使用jstack?(您可以删除不使用jstack的线程)我怀疑您得到了一个较低级别的转储,并且看到了一些正常的休眠线程。这些线程通常被忽略。您可以使用
-verbosegc
运行程序吗?嗨,Peter,谢谢您的快速回复,只是为了确保我正确地理解您的意思,您的意思是添加“-verbosegc”java命令对吗?如何提供线程转储,资源监视器的屏幕截图?将
-verbosegc
添加到
java
的命令行。如果内存不足,GC可能需要几分钟而不是几秒钟。要获得堆栈转储,请使用
jstack
并忽略/删除所有睡眠线程。如果你不知道睡眠线程是什么样子,当程序正常运行时进行堆栈转储,只显示不同的线程。一旦你缩小了一个或两个不同的线程的范围,你可以将它们的文本作为代码块发布到你的问题中。好的,这样做可能需要一些时间是的,我不知道GC是什么,但是关于内存,我使用的是16GiB ram,它的使用率只有10.3%。GC是垃圾收集器。堆的默认最大大小是内存的25%,所以如果你没有使用25%,程序甚至没有使用它的最大大小。Java 6中无法解释的长时间暂停的一个原因是试图查找主机名的IP地址s在DNS中配置不正确。在最新更新中,这应该不是什么问题。我只在它对您有意义的情况下提及它。这应该标记为实际答案@user971956。这是实际答案。