微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我们在生产tomcat服务器时遇到了一些问题,所以我想设置一些cron来定期检查线程转储,并在发生问题时发送警报邮件要做到这一点,我们需要从shell脚本中的文件线程转储,但我无法做到这一点。 从shell我可以定期发出KILL -3 <PID> ,但问题是转储到包含GB数据的catalina.out,因为只拔出线程转储是痛苦的过程。 一些讨论线程build议使用“jstack”并将输出redirect到一个文件,但这也不起作用,并给出这个错误

-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团队打开。

任何其他的build议,智能地采取和分析线程转储? 或脚本来parsing巨大的catalina.out,并得到它只是线程转储?

什么是testingNFS性能的正确方法

smartd用sendmail邮寄

如何在Linux cpu,内存和时间监视进程

创build一个虚拟显示器/虚拟显示设备

过程的已知/logging/未分类方法开始监测的是什么?

如何监视Windows目录的更改?

Python:进程/线程监视

如何监视Windows中的stream量端口?

从慕尼黑数据中删除单个样本

用PC寻找连接的USB /串行通信设备需要什么信息

结帐本文关于调度线程转储 。 我想这正是你想要做的。

一个选项可能是JMX – ThreadMXBean。 这是在SO问题上讨论如何通过JMX创建线程转储?

我发现一个简单的方法是使用javamelody 。 我们使用它来监视应用程序的各个方面,它也提供可视和常用的方式来查看当前的线程,所以我写了一个小的shell脚本,每分钟点击“http:// IP:PORT / SERVICE / monitoring?part = threadsDump”转储文件中的响应。 如果响应中包含任何被阻塞的线程脚本,则每5秒钟执行一次线程转储。 这有一定的帮助,但是当问题恶化和服务器失速时,javamelody也会停止响应。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐