我有一個java程序,具有多線程。我的問題是,我有時會超時。 因爲我有一些unix的東西,我看不到超時或/和鎖定在哪裏。問題在於,這不會每天晚上發生,只是不時發生。 實際上,一個unix組件(lsf)會終止線程(如果超過15分鐘)。因爲我看不出問題在哪裏,所以我想知道是否有人有任何想法。 有沒有機會啓動另一個java的東西,當我有一個鎖,寫一個日誌文件?如果,是的,會是什麼?Java多線程 - 檢測自動鎖定線程
0
A
回答
3
jstack是一個命令行程序,您可以用它來反省正在運行的java程序。它會打印出每個線程的堆棧跟蹤,告訴你它是否被鎖定,甚至檢測到死鎖。這可以幫助您以交互方式調試問題。
如果你想在你的程序中獲得這些數據,你可以撥打Thread.getAllStackTraces()這將得到你所有的線程和他們的堆棧跟蹤列表,所以你可以看到線程在哪裏和他們的狀態,如果你想'做如果某個線程被鎖定,就像寫入日誌文件一樣。
4
1
除了jstack你可以檢查出JConsole,這是一個GUI應用程序,允許您檢測死鎖,監視線程/內存/ CPU使用率,等它附帶的JDK。
JConsole在內部使用ThreadMXBean
,您還可以使用它編程檢測死鎖;例如我通常安排在我的服務器應用程序以定期調用下面的代碼守護線程:
private void detectDeadlocks() {
logger.info("Checking for deadlocks.");
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
long[] threadIds = threadMXBean.findDeadlockedThreads();
if (threadIds == null || threadIds.length == 0) {
logger.info("No deadlocks found.");
} else {
StringBuilder sb = new StringBuilder();
for (long threadId : threadIds) {
ThreadInfo threadInfo = threadMXBean.getThreadInfo(threadId);
if (sb.length() > 0) {
sb.append(", ");
}
sb.append(threadInfo.getThreadName()).append(" (ID: ").append(threadId).append(')');
}
logger.severe("Blocked Threads: " + sb);
// Raise alert here, etc.
}
}
相關問題
- 1. 鎖定多線程
- 2. 多線程鎖測試
- 3. Java線程鎖
- 4. 多線程自旋鎖?
- 5. 多線程鎖定Java Swing GUI
- 6. 鎖定多個線程
- 7. C#多線程 - 鎖定
- 8. Java線程鎖住
- 9. Java,線程死鎖?
- 10. Java線程死鎖
- 11. QMutex :: lock:線程中檢測到死鎖0xfe8(主線程?)
- 12. 多線程死鎖
- 13. 線程池死鎖:針對或檢測
- 14. 多線程以及多進程的Java文件鎖定方式
- 15. Java線程(多線程)
- 16. 線程在自定義線程上鎖定python
- 17. 3線程鎖定
- 18. 線程鎖定CollectionViewSource
- 19. 鎖定GLSurfaceView線程
- 20. Python線程。我如何鎖定線程?
- 21. Java線程鎖定特定對象
- 22. java編程和java單線程多線程問題(單線程與多線程)
- 23. 在C自制線程池的多線程死鎖#
- 24. Java中的多線程死鎖
- 25. Java中的多線程死鎖
- 26. Rails的線程測試分貝鎖定
- 27. 死鎖線程檢查
- 28. ASP.NET線程 - 雙重檢查鎖定
- 29. 檢查線程已經鎖定
- 30. 死鎖的線程java
正如有人曾經寫的,多線程編程是95%思維和5%編寫代碼。所以更好的重新思考所有可能的種族和死鎖情況。 – Bozho 2010-01-28 15:24:09
這是一個現有的非常大的應用程序。不可能考慮所有情況。我到達時已經準備好了。 – 2010-01-28 15:33:16