質問

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

直感的に、単一領域のコレクターと比較した世代ごとのゴミコレクターの利点は、キャッシュに対するメインメモリのレイテンシ比が増加するにつれて増加するはずです。これは、若い地域のデータに頻繁にアクセスされ、すべて1か所に保持されるためです。実験結果はこの直感を裏付けていますか?

役に立ちましたか?

解決

世代ごとのゴミコレクターのキャッシュへの影響について話すいくつかの論文を以下に示します。

私が収集できるものから、主な問題は、ガベージが収集したシステムがメモリでスペースを取引して、最前線のコレクションを避けることです。同じことがメモリをキャッシュすることにも当てはまります。あなたが提案したように、第一世代のことはおそらくキャッシュに座っている可能性が高いため、それらの割り当てとコレクションは、メインメモリの何かよりもはるかに高速になります。主な問題は、キャッシュのサイズに関する第一世代のサイズです。第一世代の前にキャッシュがいっぱいになった場合、ミスが積み上げ始めると、それらの利点が失われ始めます。

他のヒント

いくつかの説明で光沢があるかもしれないすべてのゴミコレクターには非常に難しい側面があり、それは「フルスキャン」または「フルコレクション」です。定期的に、ランダムに、断続的にすべてのオブジェクトをスキャンする必要があります。世代のコレクターは、完全なスキャンを延期し、その期間を最小限に抑える方が優れていますが、それでも必要です。

世代のコレクターは、「保育園」スペースと呼ばれることもあるものに焦点を当てますが、最終的には/必然的に「古い」世代のスペースを集めて、メモリの完全なスキャンを引き起こす必要があります。

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

したがって、この質問に対する重要な答えは、完全なスキャンがどのくらいの頻度でトリガーされるか、それが発生するときの効果がどれほど「悪い」か、それが許容できるかどうかです。これは、よりアプリケーション依存のプロパティ/質問に要約されます。

言い換えれば、コレクターの操作の「ほとんど」については、キャッシュがおそらくそれを助けます(キャッシュと「若い」保育園の空間は一般的に重複します!)が、周期的、断続的、最終的、避けられない、重い、 「古い世代」スペースがフル収集され、キャッシュ「ヒット」が非常に悪いものになると、「大規模」[劣化]パフォーマンスのスパイクでさえ、その外側の多くのオブジェクトはすべて、完全なループで完全なループでフェッチされているため、非常に悪いものになります。サイクルをスキャン/収集します。言い換えれば、避けられない定期的な不連続性(統計的推定/平均/パフォーマンスの傾向などが誤解を招き、適用できない場合)。

現在出現しているのは、基礎となるメモリ管理システム(キャッシュ/仮想化)と融合するように設計された新しいコレクションシステムです。メモリコレクション、キャッシュ、仮想化の別々のシステムを完全に分離する歴史的アプローチは、3つの側面すべてを結合/統合/アドレス指定するアプローチと同様に実行されないように見えます。

例を参照してください ZhouとDemskyによるCache Aware Garbage Collection。

ライセンス: CC-BY-SA帰属
所属していません cs.stackexchange
scroll top