2013-01-14 27 views
12

我對Go編程語言知之甚少,但我看到過幾種說Go表示Go具有無延遲垃圾回收功能,並且比其他垃圾回收器(如JVM垃圾回收器)好得多。我開發了JVM應用程序,並且我知道JVM垃圾收集器不是無延遲的(特別是在大內存使用情況下)。與其他人相比,Go語言垃圾收集方法是什麼?

我想知道,Go中的垃圾收集方法和其他使其無延遲的方法有什麼區別?

在此先感謝。


編輯: @All我編輯了這個問題完全,請投票重新討論這一問題,如果你找到它的建設性。

+6

在Java遊戲中,我永遠不會讓垃圾收集器運行,直到達到遊戲中的合適點(例如暫停菜單)。爲了達到這個目的,我總是會有一些管理員類,它保持對所有創建對象的引用,並在到達暫停菜單或關卡末尾時釋放它們。 –

+0

您可能會喜歡此作比較。 http://code.google.com/p/jgo/如果Go支持'struct',這就有可能顯式地避免GC,而不是希望JIT能夠爲你隱式地做到這一點。 –

+0

@JonTaylor你爲什麼這樣做?由於JVM垃圾收集器的性能或其他原因? –

回答

14

Go沒有無延遲垃圾收集。如果您可以指出這些聲明的來源,我想嘗試糾正它們。

我們相信Go的一個優點是Java可以讓您更好地控制內存佈局。例如,一個簡單的2D圖形包可能會定義:

type Rect struct { 
    Min Point 
    Max Point 
} 

type Point struct { 
    X int 
    Y int 
} 

在Go中,Rect只是四個在內存中連續的整數。你仍然可以通過& r.Max函數來期待一個* Point,這只是一個指向Rect變量r中間的指針。

在Java中,等價的表達式將會是Rect和Point類,在這種情況下,Rect中的Min和Max字段將指向單獨分配的對象。這需要更多的分配對象,佔用更多的內存,並且讓垃圾收集器追蹤更多內容。另一方面,它確實避免了需要創建一個指向對象中間的指針。

與Java相比,Go可以讓程序員更好地控制內存佈局,並且可以使用該控件來減少垃圾回收器的負載。這在具有大量數據的程序中可能非常重要。由於緩存效應等原因,對內存佈局的控制對於從硬件提取性能也可能很重要,但這與原始問題是相切的。

目前的Go發行版中的收集器是合理的,但決不是最先進的技術。我們計劃在未來一兩年花更多的精力來改進它。要清楚, Go的垃圾收集器當然不如現代Java垃圾收集器好,但我們相信Go在編寫不需要太多垃圾回收的程序時更容易,所以淨效果仍然可以垃圾收集在Go程序中比在等同的Java程序中更不重要。

+0

我看到它在去常見問題:http://golang.org/doc/faq#garbage_collection –

+1

我覺得比這更關係到java語言,而不是jvm本身... scala,一個jvm語言有價值類做一個類似的工作http://docs.scala-lang.org/overviews/core/value-classes.html 我希望有更多的資源比較jvm和go gc,兩者都非常有趣,我覺得那麼它們都被很多神話和誤解..... – CocoOS

+0

@SaeedZarinfam,你可能誤解了它。我沒有看到有關「無延遲垃圾收集」的說法(也沒有在[快速查找其歷史記錄](https://github.com/golang/go/blame/master/doc/go_faq.html# L1867))。它只是說「我們可以[**]沒有**顯着的**延遲實施** [相信強調增加了)」。過去,緊接着是一個關於* current *實現的括號註釋(該註釋已被移至它自己的段落)。對我來說「沒有明顯的延遲」!=「無延遲」,它也指*未來*的改進。 –