0

現在、特定のメソッドが呼び出されたときにオブジェクトを追加および削除する静的コレクションを格納しているクラスがあります。現在のコードは次のとおりです。

public class MatchMaker : Hub
    {

    private static HashSet<SoloUser> soloUsers = new HashSet<SoloUser>();

     //Client Requests
    public void findNewPartner(string Name, string Country)
    {

        SoloUser soloUser = soloUsers.Users.FirstOrDefault(s => (s.Name == Name) && (s.Country == Major));
        if (soloUsers.Users.Count > 0){
            Clients.partnerRequestResult(soloUsers.Users.FirstOrDefault());
            soloUsers.Users.Remove(soloUser);
            Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
            long totalBytesOfMemoryUsed = currentProcess.WorkingSet64;
            Debug.WriteLine("TotalMemoryUsed: " + totalBytesOfMemoryUsed);
        }
        else
        {
            soloUser = new SoloUser { 
                Name = Name,
                Country = Country                       
            };
            soloUsers.Users.Add(soloUser);
            Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
            long totalBytesOfMemoryUsed = currentProcess.WorkingSet64;
            Debug.WriteLine("TotalMemoryUsed: " + totalBytesOfMemoryUsed);
        }



    }
}

私が走るとき:

Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
long totalBytesOfMemoryUsed = currentProcess.WorkingSet64;
Debug.WriteLine("TotalMemoryUsed: " + totalBytesOfMemoryUsed);

オブジェクトがコレクションに追加またはコレクションから削除されると、totalBytesOfMemoryUsedコレクションにオブジェクトを追加または削除するかどうかに関係なく、出力はどんどん大きくなります(毎回2mbずつ)。これはメモリリークが原因ですか?これは、メモリ管理をチェックするのに十分な方法ですか?コレクションからオブジェクトを削除するときにオブジェクトを破棄する必要がありますか?

4

2 に答える 2

1

ここには、メモリリークについてコメントするのに十分な情報がない可能性がありますが、一般的な場合は、ガベージコレクタに信頼を置いてください。
それでもメモリリークが疑われる場合は、メモリプロファイラー(ANTSdotTraceなど)を使用してください。

于 2012-07-27T23:18:06.793 に答える
0

実装したオブジェクトはIDisposable、使い終わったらすぐに破棄することをお勧めします。

そのため、.NETガベージコレクターは非決定論的であることを覚えておく必要があります。これは、コレクションがいつ行われるかを事前に知る必要がないことを意味します。ランタイムがコレクションを実行する必要がある場合、ランタイムはそれを実行しようとします。とにかく2mbを恐れてはいけません。ガベージコレクターに任せましょう。

ワーキングセットのメモリを取得したり、Windowsタスクマネージャを確認したりして、プログラムのメモリ使用量を分析しようとすると、通常、うさぎの穴をたどります。実際に問題が発生した後は、メモリプロファイラーを使用してください(ANTSなど)。

また、ガベージコレクター全般に関するMSDNを読むことをお勧めします。ここから始めることができます。

于 2012-07-27T23:15:11.293 に答える