2012-04-11 48 views
0

我有一个运行Tomcat6的Ubuntu LAMJ服务器。Tomcat冻结了一个应用程序

我的一个JSP应用程序每隔几天就冻结一次,我无法找出原因。我必须重新启动tomcat才能让一个应用程序再次运行,因为它不会自行回滚。我在该应用程序的log4j日志中没有任何内容,也无法在Catalina.out中看到任何内容。

此应用程序通过server.xml文件中的上下文元素与另一个应用程序共享javax.sql.DataSource资源。我不认为这是问题的原因,但我不妨提及它。

任何人都可以指出我在正确的方向找到这种间歇性问题的原因?

在此先感谢,

克里斯蒂

+0

你可以采取线程转储吗?或整个过程是否被冻结? – Sean 2012-04-11 12:22:13

+0

嗨,肖恩。这只是一个冻结的应用程序。所有其他应用程序运行文件,而这一个被冻结。我如何从这个过程中获得线程转储? – 2012-04-11 12:32:09

+0

已发布一个回答 – Sean 2012-04-11 12:40:30

回答

0

获取正在运行的服务器 的线程转储有两种选择

使用VisualVM的

在%JAVA_HOME%/ bin文件夹会有一个名为jvisualvm的文件。运行这个并连接到你的tomcat服务器。点击从命令行

线程选项卡,然后在“线程转储”

手动打开命令行并查找进程的ID为Tomcat

ps -ef | grep java 

一旦你确定过程ID为运行的tomcat实例,

kill -3 <pid> 

这里替换进程id。这会将你的线程转储发送到你的tomcat的stdout。最有可能的是catalina.out文件。

编辑 - 按下面标记的评论:

这是正常取3线程转储〜10S分开,对它们进行比较。它 使得它更容易看到哪些线程“卡住”,哪些 正在


一旦你的线程转储你可以分析它阻塞线程。它可能不会成为问题的瓶颈,但至少可以看到服务器内部发生了什么事情来进一步分析问题。

+0

谢谢肖恩,这无疑是朝着正确方向迈出的一步。我如何找到只有一个应用程序的线程ID?我现在必须重新启动整个Tomcat才能重新启动,因为我不知道如何重新启动一个应用程序。 – 2012-04-11 12:55:05

+0

如果它们全部运行在同一个tomcat服务器上,它们共享相同的进程ID – Sean 2012-04-11 12:55:44

+0

将3个线程转储分开〜10s并进行比较是正常的。它使得查看哪些线程“卡住”以及哪些线程正在移动更容易。 – 2012-04-11 19:10:07