2013-01-14 12 views
12

私はGoプログラミング言語についてよく分かりませんが、Goにはレイテンシのないガベージコレクションがあり、他のガベージコレクタ(JVMガベージコレクタなど)よりもはるかに優れているといういくつかの主張があります。私はJVM用のアプリケーションを開発しており、JVMのガベージコレクタはレイテンシフリーではないことを知っています(特に大きなメモリ使用量で)。Go言語のガベージコレクション手法は他と比べて何ですか?

Goのガーベジコレクションアプローチと待ち時間のないものの違いは何ですか?

ありがとうございます。


編集:私は完全にこの質問を編集し@All 、あなたはそれが建設的な発見した場合、この質問を再開するために投票してください。

+6

Javaゲームでは、ガベージコレクタがゲームの適切なポイントに達するまで実行されません(たとえばポーズメニューなど)。これを達成するために、私はいつも、作成されたすべてのオブジェクトへの参照を保持し、ポーズメニューまたはレベルの終わりに達するとそれらをすべて解放するマネージャクラスのようなものを持っています。 –

+0

比較のためにこれが好きかもしれません。 http://code.google.com/p/jgo/ Goが 'struct'をサポートしている場合、JITが暗黙的にこれを行うことを期待するのではなく、GCを明示的に回避する可能性があります。 –

+0

@JonTaylorなぜこれをやったのですか? JVMのガベージコレクタのパフォーマンスやその他の理由がありますか? –

答えて

14

Goには、待ち時間のないガベージコレクションはありません。これらの主張がどこにあるのかを指摘できれば、それらを修正しようと思います。

GoogleがGoよりも優れていると考える利点の1つは、メモリレイアウトをより詳細に制御できることです。例えば、シンプルな2Dグラフィックパッケージが定義できます:ゴーで

type Rect struct { 
    Min Point 
    Max Point 
} 

type Point struct { 
    X int 
    Y int 
} 

を、のRectは、メモリ内の連続したばかりの4つの整数です。 & r.Maxを渡して、* Pointを期待する関数にすることができます。これは、Rect変数rの真ん中へのポインタです。

Javaでは、同等の表現はRectクラスとPointクラスを作成することです。この場合、RectのMinフィールドとMaxフィールドは別々に割り当てられたオブジェクトへのポインタになります。これには、より多くの割り当てられたオブジェクトが必要であり、より多くのメモリを占有し、ガベージコレクタに追跡し、より多くのことを与える必要があります。一方、オブジェクトの中央にポインタを作成する必要はありません。

Javaは、プログラマがメモリレイアウトをより詳細に制御できるようにします。このコントロールを使用すると、ガベージコレクタの負荷を軽減できます。これは、大量のデータを持つプログラムでは非常に重要です。メモリレイアウトを制御することは、キャッシュ効果などの理由でハードウェアから性能を引き出すためにも重要であるが、それは元々の問題に接している。

現在のGo配布のコレクタは、妥当なものですが、最先端のものではありません。私たちは、今後1年か2年の間にそれを改善する努力をもっと費やす予定です。 Goのガベージコレクタは、現代のJavaガベージコレクタほど良くはありませんが、ガベージコレクションを必要としないプログラムをGoで作成する方が簡単だと考えています。ガベージコレクションは、同等のJavaプログラムよりもGoプログラムの問題のほうが少ないことを示しています。

+0

私はgo faqでそれを見ました:http://golang.org/doc/faq#garbage_collection –

+1

これはjvmよりもJava言語に関連していると思います... 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))。 「[...] ** ** ** **待ち時間なしで実装することができるという自信があるだけです。これには直ちに*現在の実装に関する括弧書きが付いていました(このノートはそれ以降の段落に移動されています)。私には「重要な待ち時間なし!」=「待ち時間なし」という意味であり、*将来の改善も指します。 –

関連する問題