java - 如何从tomcat自动获取线程转储

标签 java linux multithreading shell monitoring

我们有一些问题 thread pile ups使用生产 tomcat 服务器,所以我想设置一些 cron 以定期检查线程转储并在出现问题时发送警报电子邮件。为此,我们需要从 shell 脚本中获取文件中的线程转储,但我无法做到这一点。从 shell 我可以发出 KILL -3 <PID>以周期性的间隔,但问题是转储转到包含 GB 数据的 catalina.out,因为仅拉出线程转储是一个痛苦的过程。一些讨论主题建议使用“jstack”并将输出重定向到文件,但这也不起作用并出现此错误:

-bash-3.2# java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
-bash-3.2# uname -a
Linux ip-10-130-225-20 2.6.16.33-xenU #2 SMP Wed Aug 15 17:27:36 SAST 2007 x86_64 x86_64 x86_64 GNU/Linux

-bash-3.2# sudo /usr/java/jdk1.6.0_24/bin/jstack -F 15668
Attaching to process ID 15668, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 19.1-b02
Deadlock Detection:

No deadlocks found.

Thread 8183: (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)

这个 bug 似乎是 java 团队公开的。

关于智能获取和分析线程转储的任何其他建议?或者脚本来解析巨大的 catalina.out 并从中获取线程转储?

最佳答案

查看这篇关于 scheduling thread dumps 的文章.我认为这正是您想要做的。

关于java - 如何从tomcat自动获取线程转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10154910/

相关文章:

java - 蓝牙激活时如何强制警报是否?

java - 如何在 windows7、8 中设置 java 应用程序的桌面图标?

java - 使用捕获的数据包从服务器向应用程序发送 http 响应

android - 如何通过蓝牙将 Android 应用程序连接到 Raspberry Pi,以便发送数字文本文件?

c# - .NET 多线程与多处理 : Awful Parallel. ForEach 性能

c++ - 线程化传递字符串参数的 bool 函数

java - 将 Json 字符串转换为字符串

java - 从 Java 批量复制到 SQL Server 的最有效方法是什么?

linux - 在 UNIX 中运行 .exe 文件

java - 想知道我的 Java 线程程序做错了什么吗?