7

この写真で[ガベージコレクション]とはどういう意味ですか?そして「20コール」のこと?

つまり、GCに時間がかかった理由をどのように理解できますか?たくさんの小さな物を集めていましたか?一つの大きなもの?これを最適化する方法についてのヒントはありますか?

問題のコードは次のとおりです。

private void DeserializeFrom(SerializationInfo info)
{
    Width = info.GetInt32("width");
    Height = info.GetInt32("height");
    var data = (List<byte>)info.GetValue("cells", typeof(List<byte>));
    cells = new Cell[physicalSize.Width, physicalSize.Height];
    int pos = 0;
    for (int x = 0; x < physicalSize.Width; x++)
    {
        for (int y = 0; y < physicalSize.Height; y++)
        {
            cells[x, y] = new Cell();
            if (x < Width && y < Height)
            {
                cells[x, y].HasCar = data[pos];
                pos++;
            }
        }
    }
}

派手すぎるものはありません。犯人は大きなList<byte>物だと思いますが、(小さな物をたくさん集めるのではなく)一瞬で大きな物を集めることになっていると思いました。

4

2 に答える 2

2

何が GC を引き起こしているのか、どのオブジェクトが割り当てられて収集されているのかを知りたい場合は、dotMemory を介して行うことができます。メモリ トラフィックを最適化する方法を説明するチュートリアルを次に示します: https://confluence.jetbrains.com/display/NETCOM/Tutorial+3+-+How+to+Optimize+Memory+Traffic+with+dotMemory

于 2015-02-23T14:27:44.857 に答える
1

パーティーに少し遅れましたが、.Net を使用している場合はマネージ コードを使用していることになります。これは基本的に、.Net ランタイムがそれに応じてオブジェクトを破棄するため、C や C++ とは対照的にメモリ リークが発生しないことを意味します。

ガベージ コレクションは、ランタイムがアプリケーションのメモリの割り当てと解放を管理するのに時間がかかる場合に発生します。この場合、それが起こっています。

doTrace (私はバージョン 6 を持っています) で使用できるこのフィルターを見てください。これにより、ガベージ コレクションを分析し、それがいつ実行をブロックするかを判断できます。 https://www.jetbrains.com/profiler/help/CLR_Activity.html

于 2015-02-09T18:57:30.387 に答える