无法获取线程转储?我的应用程序为什么会阻塞?

9
我有一个基本的Java服务器应用程序,有100个工作线程对URL进行简单的HEAD请求。我使用HttpClient 4.x实现这一功能。
运行几分钟后,我的程序会在几分钟内冻结,我无法找出原因。请查看visual vm监视器报告的屏幕截图。您可以看到它的值为零。在此期间,我无法获得良好的线程转储,并且visual vm会冻结,直到被解除阻塞。有没有人有任何想法,可以尝试开始调试这个问题?
Visual VM:http://tinypic.com/view.php?pic=2i915bs&s=7 以下是当我尝试在程序冻结时进行jstack转储时的输出:
jstack -F 4325 
Attaching to process ID 4325, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 16.3-b01
Deadlock Detection:

No deadlocks found.

Thread 4557: (state = BLOCKED)
Error occurred during stack walking:
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: get_thread_regs failed for a lwp
    at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.execute(LinuxDebuggerLocal.java:152)
    at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.getThreadIntegerRegisterSet(LinuxDebuggerLocal.java:466)
    at sun.jvm.hotspot.debugger.linux.LinuxThread.getContext(LinuxThread.java:65)
    at sun.jvm.hotspot.runtime.linux_amd64.LinuxAMD64JavaThreadPDAccess.getCurrentFrameGuess(LinuxAMD64JavaThreadPDAccess.java:92)
    at sun.jvm.hotspot.runtime.JavaThread.getCurrentFrameGuess(JavaThread.java:256)
    at sun.jvm.hotspot.runtime.JavaThread.getLastJavaVFrameDbg(JavaThread.java:218)
    at sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:76)
    at sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:45)
    at sun.jvm.hotspot.tools.JStack.run(JStack.java:60)
    at sun.jvm.hotspot.tools.Tool.start(Tool.java:221)
    at sun.jvm.hotspot.tools.JStack.main(JStack.java:86)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at sun.tools.jstack.JStack.runJStackTool(JStack.java:118)
    at sun.tools.jstack.JStack.main(JStack.java:84)
Caused by: sun.jvm.hotspot.debugger.DebuggerException: get_thread_regs failed for a lwp
    at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.getThreadIntegerRegisterSet0(Native Method)
    at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.access$800(LinuxDebuggerLocal.java:51)
    at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$1GetThreadIntegerRegisterSetTask.doit(LinuxDebuggerLocal.java:460)
    at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.run(LinuxDebuggerLocal.java:127)

我也有这个问题,看起来(不保证)它主要发生在64位的JVM上。 - whiskeysierra
所有请求都发往同一台服务器吗?(即,你确定不是服务器未响应请求?) - Andre Holzner
3个回答

4
我看到了几个关于Linux上的错误报告,其中有相似的跟踪信息:

使用kill -3 <pid>会得到相同的结果吗?


0

很可能是由于内存使用过多导致GC。在Java中添加参数:

-verbosegc -XX:+PrintGCDetails

查看输出/日志,看是否注意到任何明显的问题


0
我的解决方法是以进程所有者身份运行 jstack,不要 使用 -F 参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接