そこで、メモリを大量に消費するアプリ用に実験的なキャッシュを実装し、ヒープをミックスに投入して、キャッシュが特定の制限を超えたら、アクセスが最も少ないオブジェクトを簡単に取得できるようにしました。すぐには再利用されない可能性が高く、再利用される場合は、データベースからそれらを取得します。
ここまでは問題ありませんが、まだデータベースに書き込まれておらず、削除してはならないオブジェクトがある可能性があります。「ダーティ」ビットを設定することでそれを処理できますが、問題ありません。しかし、問題の別の原因があります。特定のキャッシュされたオブジェクトへの有効な参照がまだどこかに潜んでいる場合はどうなるでしょうか? f
これにより、関数が の ID を持つオブジェクトへの参照 A を保持し、そのオブジェクトがxxx
キャッシュから消去され、別の関数g
が同じ ID の オブジェクトを要求するが、A とは異なる別のxxx
参照 B を取得するという状況が発生する可能性があります。これまでのところ、特定の ID を持つ永続化されたオブジェクトのインスタンスは 1 つしか存在しないという前提でソフトウェアを構築しています (それはばかげているのでしょうか?)。
これまでの私の推測では、ガベージ コレクション関連のメソッドから利益を得ることができるということです — それをgc.get_reference_count( value )
確認し、上記のカウントを知ることは1
(value
がキャッシュにあるため)、いくつかのクロージャがまだ に保持されていることを意味するvalue
ため、パージするべきではありません。
この方向で役立つものは何も見つかりませんでした。問題は一般的に別の解決策を必要としますか?