0

C# でのメモリの解放に問題があります。オブジェクトへの参照で満たされた静的辞書を含む静的クラスがあります。単一オブジェクト zajumie 大量のメモリ。ときどき、null に設定されたオブジェクトへの古い参照を削除してメモリを解放し、ディクショナリからアイテムを削除します。残念ながら、この場合、メモリの速度は低下していません。システム内のメモリの最大サイズに達した後の時間は、未使用のリソースが突然解放され、使用されるメモリの量が正しく減少したかのようになります。以下はクラスの図です。

public class cObj
{
    public DateTime CreatedOn;
    public object ObjectData;
}

public static class cData
{
    public static ConcurrentDictionary<Guid, cObj> ObjectDict = new ConcurrentDictionary<Guid, cObj>();
    public static FreeData()
    {
        foreach(var o in ObjectDict)
        {
            if (o.Value.CreatedOn <= DateTime.Now.AddSeconds(-30))
            {
                cObj Data;
                if (ObjectDict.TryGetValue(o.Key, out Data))
                {
                    Data.Status = null;
                    Data.ObjectData = null;
                    ObjectDict.TryRemove(o.Key, out Data);
                }
            }
        } 
    }
}

この場合、メモリは解放されます。ただし、この操作の後、 GC.Collect (); 使用されていないオブジェクトの予想されるリリースに続いて呼び出します。

問題を解決するには、GC.Collect()?を使用する必要はありません。

4

1 に答える 1

0

ほとんどの場合、GC.Collect()を呼び出す必要はありません。GC.Collectするかどうか?

nエントリに制限された辞書を作成したばかりの同様のシナリオがありました。これは、ConcurrentDictionaryの上で自分で行いましたが、BlockingCollectionを使用できます。

考えられる利点の1つは、100万のエントリが同時に追加された場合、30秒後ではなく、nを除くすべてがガベージコレクションに使用できるようになることです。

于 2012-12-13T13:43:01.883 に答える