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

Java 无法获取线程转储?知道我的应用程序为什么会阻塞吗?,java,multithreading,debugging,stack,Java,Multithreading,Debugging,Stack,我有一个基本的java服务器应用程序,它有100个工作线程,可以对URL执行简单的头请求。我正在使用HttpClient 4.x来实现这一点 运行几分钟后,我的程序就冻结了几分钟,我不知道为什么。查看visual vm monitor报告的屏幕截图。你可以看到它的平面。在这段时间里,我无法得到一个好的线程转储,可视化虚拟机只是冻结,直到它被解锁。有人知道我能做些什么来调试这个家伙吗 可视虚拟机: 以下是我尝试在冻结jstack转储时的输出: jstack -F 4325 Attaching t

我有一个基本的java服务器应用程序,它有100个工作线程,可以对URL执行简单的头请求。我正在使用HttpClient 4.x来实现这一点

运行几分钟后,我的程序就冻结了几分钟,我不知道为什么。查看visual vm monitor报告的屏幕截图。你可以看到它的平面。在这段时间里,我无法得到一个好的线程转储,可视化虚拟机只是冻结,直到它被解锁。有人知道我能做些什么来调试这个家伙吗

可视虚拟机:

以下是我尝试在冻结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)

很可能是由于内存使用过多导致GC。将参数添加到java:

-verbosegc -XX:+PrintGCDetails

看看您是否注意到输出/日志中有任何明显的内容

我已经看到了一些关于Linux上的
jstack
的bug报告,其中有类似的跟踪:

  • JVM(应该是固定的)
  • Ubuntu(这个不是)

通过使用
kill-3
,您会得到相同的结果吗?

对我有效的方法是以进程所有者的身份运行jstack,而不使用
-F

我也有这个问题,而且似乎(不保证)这种情况主要发生在64位JVM上。请求是否都转到同一台服务器?(即,您确定不是服务器没有响应请求吗?)