簡単なプログラミング言語を実装しようとしています。ユーザーがメモリを管理する必要がないようにしたいので、ガベージコレクターを実装することにしました。いくつかの資料をチェックした後に考えることができる最も簡単な方法は次のとおりです。
2 種類のヒープ ゾーンがあります。1 つ目は大きなオブジェクト (85,000 バイト以上) を格納するためのもので、もう 1 つは小さなオブジェクトのためのものです。以下では、最初に BZ を使用し、2 番目に SZ を使用します。
大きなオブジェクトの移動にはコストがかかるため、BZ はマーク アンド スイープ アルゴリズムを使用します。圧縮しないので、断片化があります。
SZ は、mark-compact の世代を使用します。ジェネレーションは 0、1、2 の 3 つです。割り当て要求は直接ジェネレーション 0 に送られ、ジェネレーション 0 がいっぱいになるとガベージ コレクションが実行され、サバイバーはジェネレーション 1 に昇格されます。ジェネレーション 1 とジェネレーション 2 はいっぱいになったらガベージコレクションも行います。
仮想マシンが起動すると、OS から大きなメモリが割り当てられ、仮想マシンのヒープ ゾーンとして使用されます。BZ と SZ のすべての世代がメモリの固定部分を占有し、割り当て要求ができない場合満たされると、仮想マシンはエラー OTM (メモリ不足) を返します。これには問題があります。仮想マシンが起動すると、プログラムを実行するのに必要なメモリはわずかですが、それでも大量に使用されます。より良い方法は、仮想マシンが OS から少量のメモリを取得し、プログラムがより多くのメモリを必要とするときに、仮想マシンが OS からより多くのメモリを取得することです。SZ でジェネレーション 2 に大きなメモリを割り当て、ジェネレーション 2 のすべてのものを新しいメモリ ゾーンにコピーします。BZ についても同じことを行います。
もう 1 つの問題は、BZ がいっぱいで SZ が空の場合に発生します。実際には SZ にビッグ オブジェクト用の十分な空きヒープ サイズがあるにもかかわらず、ビッグ オブジェクトの割り当て要求を満たすことができないというのはばかげています。この問題に対処するには?