2012-04-11 75 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