2013-08-27 77 views
3

正如我在Sun內存管理白皮書閱讀:關於垃圾收集行爲查詢

When stop-the-world garbage collection is performed, execution of the application is completely 
suspended during the collection 

所以,如果一個請求,而垃圾收集器運行,那麼它是如何應用程序處理的情況發生?如果垃圾收集器花費太長時間,應用程序會拋出異常?我沒有遇到這樣的問題,但想知道這是可能的,並拋出什麼異常?

+0

我不認爲會有任何異常將被拋出。 – codeMan

+0

但是如果網絡操作正在進行,那麼確實需要更長時間纔會出現某種網絡超時。那麼如何處理 – DevZer0

回答

0

這個垃圾回收器不再被使用,並被更好的垃圾回收器取代。

stop-the-world垃圾回收器確實停止了完整的應用程序(所有線程)並清理了堆。

當垃圾收集器花費太長時間(幾乎從不發生),則會拋出一個Error

收集器運行時緩衝網絡套接字上的流量。

+0

拋出異常?我知道這一點!哪個例外會是@Uwe Plonus – codeMan

+0

如果任何垃圾收集器無法及時執行任務,則會拋出'OutOfMemoryError'。 –

+0

@UwePlonus:如果收集器是一個停止世界的收集器,它不需要多長時間,因爲程序已經停止並且沒有分配發生,所以您不會收到OutOfMemoryError。如果垃圾收集完成其運行,但無法回收任何可用空間,則可能會發生OutOfMemoryError。 – davmac

1

所有(幾乎)Java垃圾收集器都有某種停止世界階段,其中所有Java線程都掛起,等待獨佔系統操作完成。該狀態有時被稱爲安全點

現代垃圾收集器與應用程序線程同時運行,這意味着垃圾收集器與應用程序同時執行其工作。在垃圾收集器進程期間,需要獨佔訪問內存的階段,應用程序線程進入此狀態。

如果垃圾收集器無法恢復足夠的內存以滿足應用程序的分配需求,則會引發異常。

擺脫停止世界垃圾回收的一種替代方法是使用Azul系統中的C4收集器進行Zing JVM。這種實現具有很低的停頓方式,根本沒有停止世界的收藏。相反,它使用的是並行壓縮方法,沒有停止世界階段。

+0

線程在安全點之間可以運行多長時間?如果線程X位於安全點之間,並且需要垃圾回收,那麼只要X使其到達下一個安全點,就會要求所有其他線程停止運行,無論收集的時間長短如何? – supercat