世代別ガベージコレクターは本質的にキャッシュフレンドリーですか?


38

典型的な世代別ガベージコレクタは、最近割り当てられたデータを別のメモリ領域に保持します。典型的なプログラムでは、多くのデータは短命であるため、若いガベージ(マイナーGCサイクル)を頻繁に収集し、古いガベージを頻繁に収集しないことは、メモリオーバーヘッドとGCの実行時間の適切な妥協点です。

直感的には、若いリージョンのデータに頻繁にアクセスし、すべてを1か所に保持するため、キャッシュに対するメインメモリの待機時間比率が増加すると、単一リージョンコレクターと比較した世代別ガベージコレクターの利点が大きくなります。実験結果はこの直感を裏付けていますか?


回答:


19

世代別ガベージコレクターのキャッシュの意味について説明するいくつかの論文があります。

私が収集できるものから、主な問題は、ガベージコレクションされたシステムがメモリ内のスペースをトレードオフして、事前の収集を回避することです。同じことがキャッシュメモリにも当てはまります。あなたが提案したように、第一世代のものはキャッシュに座っている可能性が最も高いので、それらの割り当てとコレクションはメインメモリにあるものやディスクにページアウトされるものよりもはるかに高速になります。主な問題は、キャッシュのサイズに関する第1世代のサイズです。第1世代が完了する前にキャッシュがいっぱいになると、ミスが蓄積し始めるため、これらの利点が失われ始めます。


10

すべてのガベージコレクターには非常に扱いにくい側面がありますが、これは一部の説明で説明されている可能性があり、それは「フルスキャン」または「フルコレクター」です。定期的、ランダム、断続的にすべてのオブジェクトをスキャンする必要があります。世代別コレクターは、フルスキャンを延期し、その期間を最小化するのに優れていますが、それでも必要です。

世代別コレクターは、「ナーサリー」スペースと呼ばれることもありますが、最終的に/必然的に「古い」世代スペースに収集する必要があり、メモリのフルスキャンが発生します。

このフルスキャンは、ほとんどすべてのメモリキャッシングと(特に!)仮想化スキームと互換性がありません。この場合、ほとんどすべてのメモリキャッシング/仮想化スキームは、パフォーマンスの改善においてひどく失敗するはずです。

したがって、この質問に対する重要な答えは、フルスキャンがトリガーされる頻度、およびその効果が発生するタイミングと、許容できるかどうかです。これは、よりアプリケーションに依存するプロパティ/質問に要約されます。

言い換えると、コレクターの「ほとんどの」操作の場合、キャッシュがおそらく役立ちます(キャッシュと「若い」ナーサリースペースは一般に重なります!)が、定期的、断続的、最終的、不可避、重い、 「古い世代」のスペースが完全に収集され、キャッシュの「ヒット率」が非常に悪い場合、パフォーマンスの「大規模な」[低下]スパイクもあります。スキャン/収集サイクル。言い換えれば、避けられない周期的な不連続性(パフォーマンスの統計的推定/平均/傾向などが誤解を招き、適用できない場合)。

現在登場しているのは、基礎となるメモリ管理システム(キャッシュ/仮想化)とメッシュするように設計されたいくつかの新しい収集システムです。メモリ収集、キャッシュ、および仮想化の個別​​のシステムを完全に分離する歴史的なアプローチは、3つの側面すべてを結合/統合/アドレス指定するアプローチと同様に機能しないようです。

たとえば、ZhouとDemskyによるキャッシュ対応のガベージコレクションを参照してください


したがって、世代別GCは、世代別(クラシック)GCと比較してキャッシュに優しいと主張できますか?
ラファエル

GCは、既存のアーキテクチャでは扱いにくい設計の一環として、キャッシュと仮想メモリを統合した方法で設計する必要があると主張します。しかし世代コレクタanswer--はいに拡大する集約/ consolodate /グループ後者が(頻繁に使用頻度の低いオブジェクトが散乱された/混合他の設計よりも本質的にキャッシュ互換される連続したメモリに頻繁に使用されるオブジェクトキャッシュのメリットはまだあります)。
vzn

1
GCアーキテクチャとキャッシュ/仮想化アーキテクチャをマージすることのやや難しい点の1つは、そのようなアーキテクチャは一般にメモリページのコンテンツを気にかけないことですが、GCシステムでは必要です。異なる言語は、プログラマに異なるGC関連機能を約束する場合があり、OSレベルでどの機能をサポートするかを判断するのは難しい場合があります。おそらく、各オブジェクトには、OSによって初期フィールドが定義されている構造体へのポインターを含める必要があるが、OSが知らないか気にしない言語固有のデータが後に続く可能性があると言うのが最善のアプローチでしょう。
-supercat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.