2

「安全」が誤解を招く言葉でしたら申し訳ありません。この状況でどの言葉を使用すればよいかわかりませんでした。たとえば、

 public static List<myObj> myList = new List<myObj>();

C# では許容されます。静的変数は、アプリケーションのライフ サイクル全体を通して RAM に残ります。そのため、たとえば ASPX などのアプリケーションでは、これが望ましくない動作につながる可能性があり、GC は割り当てを収集しません。

静的なオブジェクトのリストがある場合、たとえば静的な「グローバル」クラスであることに気付きました。

 globl.myList.add(foo);

その後、それらはアプリケーションの存続期間中残ります。これは、オブジェクトの静的リストがある場合、リストに追加されるオブジェクト自体が静的であることを意味しますか、それともそれらへの参照があるため、GC はそれらを収集しませんか? つまり、要素を削除した場合、GC は後でそれを収集しますか、それともアプリケーションが終了するまでヒープにスタックされますか?

お早めにどうぞ!

4

5 に答える 5

4

ここでの安全とは、非常に疑わしい用語です。どのような状況で安全ですか?

メモリの観点から安全ですか:ほとんどはい。リストへの参照の追加は、staticその参照が後で削除され、他の誰も参照していない場合でも収集可能です。したがって、staticリストにアイテムを追加しても、それ自体でアイテムの収集が妨げられることはありません。

はいえ、すべての参照がなくなる前にアイテムがstaticリストに長期間保持されている場合、GCライフサイクルの後半の世代に昇格する可能性があります。これにより、アイテムのメモリクリーンアップがすべて遅くなる可能性があります。参照がリリースされます。

スレッドセーフの観点から安全ですか:ほとんどありません。他のスレッドがリストを読み取ることができるときにリストが変更可能である場合は、リストへのアクセスを同期する必要があります。とはいえ、リストが作成時にロードされる場合、複数のスレッドが「読み取り専用」の方法で安全にリストにアクセスできます。

また、可変コレクションへの同時アクセスが必要な場合は、代わりに.NET 4.0の同時コレクションを検討してください(MSDN

于 2012-10-26T15:17:03.357 に答える
1

ネガティブ。参照がこのように保持されている限り、GCはリスト内の参照を収集しません。

オブジェクト自体はそれ自体が「静的」ではなく、静的参照に関連して存在するだけです。

于 2012-10-26T15:17:27.700 に答える
1

List のみが静的です。オブジェクトはそうではありません。オブジェクトを削除し、そのメモリへの参照が他にない場合、そのオブジェクトはガベージ コレクションの対象になります。

于 2012-10-26T15:18:59.843 に答える
1

静的変数は、アプリケーションのライフ サイクル全体を通じて RAM に残ります。

それらはAppDomainの存続期間中メモリ内にあります。IISの場合、これは AppPool の存続期間を意味します。IIS は AppPools を定期的にリサイクルするため、データが無期限にメモリに残るという保証はありません。

これは、オブジェクトの静的リストがある場合、リストに追加されるオブジェクト自体が静的であることを意味しますか、それともそれらへの参照があるため、GC はそれらを収集しませんか?

いいえ、オブジェクトは静的ではありません - オブジェクトへの参照があるため収集されません。

要素を削除した場合、GC は後でそれを収集しますか、それともアプリケーションが終了するまでヒープにスタックされますか?

何かがそれへの参照を保持している限り、収集されません。リストが参照する唯一のものである場合、リストから削除されると、GC の対象となります。

于 2012-10-26T15:20:18.873 に答える
0

要素を削除した場合、GC は後でそれを収集しますか、それともアプリケーションが終了するまでヒープにスタックされますか?

実験を作成し、ビットマップのような大きな画像をロードしてリストに追加するプログラムを作成し、リストから削除してからgc collectを開始し、タスクマネージャー(cntr + shift + esc)メモリで確認できますあなたのアプリの消費。例えば:

class Program
    {
        public static List<Bitmap> Bitmaps = new List<Bitmap>(); 

        static void Main(string[] args)
        {
            Bitmaps.Add((Bitmap) Image.FromFile(@"C:\\image.bmp")); // the size of image 23 mb (in that case), you will see in task manager that you app start consumes a lot of memory
            Console.WriteLine("Memory state after loading image in list");
            Console.ReadKey();
            Bitmaps.RemoveAt(0);
            GC.Collect();
            Console.WriteLine("Memory after collect"); // and after deletion from list and start gc you will see that your app consume  less memory
            Console.ReadKey();
        }
    }

リストから削除した後、GCが要素を収集することを意味します。

于 2012-10-26T15:39:05.140 に答える