我有一個運行大型應用程序的Tomcat服務器。它有類似於此示例兩類:Java方法停止調用
public abstract class ClassA {
private static final Logger LOGGER = Logger.getLogger(ClassA.class);
// ...
public File methodA(ICancellable cancel) {
URL request = new URL("an URL");
LOGGER.debug("Calling ClassB.methodB(type)");
File f = classB.methodB(request, "type", cancel);
LOGGER.debug("The call to ClassB.methodB(type)"
+ " returned the File==" + f);
// ...
}
}
public class ClassB {
private static final Logger LOGGER = Logger.getLogger(ClassB.class);
// ...
public static synchronized File methodB(URL url, String type,
ICancellable cancel)
{
final String thisMethodsName = "ClassB.methodB(url: " + url
+ ", type:" + type + ", cancel: " + cancel + ")";
LOGGER.debug("Entering method: " + thisMethodsName);
// ...
return f;
}
}
的應用程序正常工作,並ClassA.methodA()
最初調用成功地以ClassB.methodB()
,我可以在日誌文件中看到:
[...]
14/02/2013 12:34:56 DEBUG ClassA:123 - Calling ClassB.methodB(type)
14/02/2013 12:34:56 DEBUG ClassB:456 - Entering method: ClassB.methodB(url: anURL, type: type, cancel: @1234);
[...]
14/02/2013 12:34:56 DEBUG ClassA:125 - The call to ClassB.methodB(type) returned the File=="aFile".
[...]
我的問題是後服務器正在工作一段時間,它停止呼叫ClassB.methodB()
。應用程序被掛起,它只是將它寫入日誌:
[...]
14/02/2013 12:34:56 DEBUG ClassA:123 - Calling ClassB.methodB(type)
這是日誌文件的最後一行。實際上並沒有調用ClassB.methodB()
。
我懷疑這可能是由於打開的資源,werent關閉,但我試圖找到所有的代碼,做到了這一點,並在修復後,它仍然發生。
什麼可能導致這種情況?我怎樣才能繼續尋找原因?
JVM版本:1.6.0_13 Tomcat的版本:6.0.18
我認爲在極端情況下文件變得非常巨大(即GB +)時,它需要更多時間才能附加到它。 – 2013-02-14 11:55:12
您是否檢查過以前對「ClassB.methodB」的調用實際上已完成? – Qwerky 2013-02-14 11:55:58
下載的文件不大於類似(甚至相同)文件下載的時間。無論如何,我已經等了好幾個小時,應用程序還是什麼也不做。 – 2013-02-14 11:57:27