2011-05-21 117 views

回答

0

看看http://developers.sun.com/mobility/midp/articles/garbage/

隨着Java技術變得越來越電信(電信)行業更普遍,瞭解垃圾收集器的行爲變得更加重要。通常,電信應用程序是接近實時的應用程序。以毫秒爲單位測量的延遲通常不是問題,但延遲數百毫秒(更不用說秒)會給這類應用帶來麻煩。很簡單,次優績效直接導致收入損失。

基本上,如果垃圾收集器壓縮一個小堆,那麼延遲很短,但是如果您已經產生了大量垃圾,並且有很大的可達對象圖,則可以看到很大的延遲。新的垃圾收集算法(分代/增量式GC)已經在一定程度上緩解了這個問題,但是調整GC仍然是一種黑色藝術。

+0

@Stephen C.我假定堆的大小與非垃圾對象的數量成正比。單個GC傳遞的成本的確與在沒有ephemeron表的標記和清除收集器中的那些對象的數量成正比,但執行的GC傳遞的數量與生成的垃圾對象佔用的組合大小成比例。將編輯使用術語「增量」而不是「併發」GC。 – 2011-05-21 02:21:37

+0

@Stephen C.我編輯了一些。我認爲你說得對,我的語言很混亂。 – 2011-05-21 02:23:50

0

垃圾收集不會在特定時刻發生。它發生在虛擬機決定這麼做時(可能在內存不足時)。

垃圾收集是你的程序應該做的另一項工作,所以在總時間,你的程序是比較慢。但在執行過程中,用戶感覺到的滯後很小。

0

在Java中,對象壽命自動管理。 Java垃圾收集器將執行標記和掃描算法(O(N)算法)來遍歷對象圖並清理未被引用的對象。用戶沒有可靠的方法來觸發垃圾收集(用戶可以調用System.gc(),但不能保證立即運行)。當垃圾收集發生的時候,很大程度上取決於JVM的實現。

所以,回到你的問題,當人們說垃圾收集拖慢他們的應用程序,這意味着標記和清除算法帶走他們的一些機器的硅時間。

在iOS中的世界裏,你說的是對的,對象獲得時,他們放心了垃圾收集。這裏釋放意味着對象的引用計數變爲0,程序員負責增加或減少引用計數。在這種情況下,垃圾收集的運行時間爲O(1)。

0

當Java虛擬機運行的內存(或者決定啓動垃圾收集某些其他原因),垃圾收集器將確定是否存在一些可以不再使用任何對象。這很昂貴(特別是如果你有很多對象),並且可能發生在不可預知的時間。

相比之下,像C語言不具有垃圾收集器允許編程更好的控制水平。這可以避免垃圾收集的昂貴和不可預測的運行,或至少確保它們不會發生在不合時宜的時刻。