2012-09-06 42 views
3

當我用java程序運行我的jvmti代理程序時,似乎jvm遇到了一個死鎖。 在我的jvmti代理中,我在Agent_OnLoad()中創建了一個原始監視器,並在每個回調函數的開頭輸入該鎖,並在每個回調函數結束時退出該鎖。 我不知道這個僵局的原因。 jvmti代理中是否存在其他可能的死鎖?jvmti代理程序死鎖

感謝。

回答

1

是的,JVMTI Agent中存在死鎖的可能性。 JVMTI Reference指出:

相同的線程可能會多次進入一個監視器。該線程必須退出顯示器的次數與輸入次數相同。如果在OnLoad過程中(在附加線程存在之前)輸入了 監視器,並且 在附加線程出現時未退出,則輸入爲 認爲在主線程上發生了。

它可以是很難做出在這種情況下,遠程診斷,但我會建議你去看看demo JVMTI applications如何處理使用生鎖。使用專用功能enter_critical_sectionexist_critical_section。也許這有幫助,否則嘗試通過調試代理找到導致死鎖的回調。

0

當多個線程同時調用JVMTI代理時,我遇到了同樣的問題。一個線程成功調用RawMonitorEnter並繼續。在此之後,許多其他線程按預期調用RawMonitorEnter並阻止。持有原始監視器的線程然後調用RawMonitorExit,但看起來該函數不返回,這導致死鎖。

解決方法是將RawMonitorEnter/Exit和它們之間的邏輯封裝在互斥體中。這確保了一次只有一個線程會嘗試獲取原始監視器。解決方法也可能完全否定對原始監視器的需求。