1

ガベージコレクション言語用のコンパイラを作成していますが、ガベージコレクタをいつ実行する必要があるかを知る方法について混乱しています。

私が考えることができる2つの方法があります:

  1. すべてのヒープ割り当ての前にGCチェックを配置します。したがって、割り当てが失敗しそうな場合は、GCを実行します。

  2. GCチェックを「定期的に」実行し、スペースが「危険なほど」少なくなったらGCスイープを実行します。

現在、2番目のスキームを使用しているため、すべての関数エントリの先頭にGCチェックを実行して、GCチェックが十分な頻度で実行されるようにします。

このテーマに関する詳細情報がどこにあるか知っている人はいますか?

4

1 に答える 1

1

「この件に関する詳しい情報をどこで見つけられるか知っている人はいますか」という質問に対する最良の参考文献は、@ Raymond Chen が指摘したPaul Wilson の調査論文です。

既存のガベージ コレクター アルゴリズムの概要については、このリンクを確認してください。

(1)と(2)の2つの方法のうち、両方でチェックする必要があると思います。

特定の制約でヒープを定義したと仮定します.(主な制約はsize_t maximumSize , base , limit ,NoOfBytesAllocatedです) . したがって、そのヒープ構造にさらにいくつかのフィールドを追加するとlimitForGcInSizeMinor ,limitForGcInSizeMajor limitForGcInObjects、より良い方法で GC の状況に取り組むことができます (ヒープ構造に既にこのフィールドがある場合は無視してください)。

SO 割り当て >= limitForGcInSizeMinor はいつでも GcMinor を実行します (ワールド メカニズムを停止するか、同時実行することができます) 。割り当てが limitForGcInSizeMajor に達した場合、GCMajor を実行します (stop the world のようなもの)。GCMinor と GCMajor を分割する主な理由は、GC スパイク (世界のメカニズムが停止したとき) の影響を最小限に抑えることです。

したがって、GC に沿ってずっと (2) の方法に従いました。つまり、定期的にヒープ割り当てを使用してチェックすることです。私はそれをCMSアルゴリズムから借りました。

于 2013-02-25T14:55:21.917 に答える