某些東西正在中斷我的應用程序中的線程。它看起來發生在JVM即將耗盡堆空間時。我可以爲JVM配置額外的堆,但我很好奇垃圾收集器是否在試圖回收內存時中斷線程。有人知道嗎?我在RedHat ES 5.2上使用64位Java 1.6.0_16。Java的垃圾收集器會中斷一個線程嗎?
感謝,
約翰
某些東西正在中斷我的應用程序中的線程。它看起來發生在JVM即將耗盡堆空間時。我可以爲JVM配置額外的堆,但我很好奇垃圾收集器是否在試圖回收內存時中斷線程。有人知道嗎?我在RedHat ES 5.2上使用64位Java 1.6.0_16。Java的垃圾收集器會中斷一個線程嗎?
感謝,
約翰
中斷在罰球InterruptedException
?不,這不應該發生。它可能需要暫停線程本身,但這不是一回事。如果虛擬機完全耗盡內存,它應該拋出OutOfMemoryError
而不是...
'OutOfMemoryError'實際上。 – 2010-03-10 19:57:49
@Thomas:謝謝,修正。 – 2010-03-10 20:37:21
除非發生OutOfMemory,否則如果發生垃圾回收,線程將不會中斷。他們可能會等待一段時間。
您可能會收到所謂的spurious interrupts。它們可能隨時發生,但低內存/高負載情況可能使它們更有可能。但是,這將取決於JVM實現的細節,這不是一個規則,並且與垃圾收集的關聯(如果實際存在的話)是偶然的,而不是通過設計。
完全相反 - 線程被喚醒*沒有* InterruptedException,並且沒有滿足等待條件。 – 2012-02-25 23:32:22
@HotLicks在其中一條評論中,原作者聲明「在這種情況下,線程會得到InterruptedException。」。所以他的情況確實適合虛假的中斷場景。 – 2012-02-26 10:47:31
@Michał我很感激你繼續爲此研究解決方案。但是你鏈接的文檔談到了「虛假喚醒」,而不是中斷。在我的情況下,中斷不是垃圾收集器,它是另一個線程在得到OutOfMemoryError後嘗試清理。我很確定最初接受的答案是正確的。 – 2012-02-26 13:24:30
請定義「中斷」。你的意思是線程暫停或你得到一個'InterruptedException'? – 2010-03-10 18:31:52
在這種情況下,線程得到一個InterruptedException。 – 2010-03-10 19:25:07