0

Visual C# でメモリ リークを実行しようとしています。私はこのコードを使用しました:

class Program
{
    static void Main(string[] args)
    {
        List<float> s = new List<float>();
        while (true) {
            s.Add(10 ^ 10);
        }
    }
}

このプログラムを実行すると、2 分以内に OutofMemory Exception が発生しました。これはメモリリークの本当のコードですか? メインメモリスペースを監視していましたが、十分なスペースがありました。これがメモリ リークである場合、RAM にスペースがあったにもかかわらず、これが発生する原因は何ですか? このリークを監視するにはどうすればよいですか?

4

3 に答える 3

5

これはメモリ リークではありません。追加した各番号は、引き続きリスト オブジェクトからアクセスできます。あなたのコードは大量のメモリを使用しているだけで、最終的には不足します。

1 つのオブジェクトの最大メモリ量に達している可能性があります。

ガベージ コレクターは、オブジェクトへの参照がなくなると、オブジェクトに関連付けられたメモリの割り当てが解除されるようにします。

于 2013-05-01T16:41:10.160 に答える
2

あなたの例はメモリリークではありません。メモリが不足しますが、作成されたすべてのオブジェクトは実行中のプログラムからアクセスできます。リークとは、メモリ内にアクセスできないオブジェクトがある場合です。.NET でのリークの最も一般的な原因である、静的イベントへのサブスクリプションの例を次に示します。

internal class Program
{
    public static event EventHandler SomeStaticEvent;

    private static void Main()
    {
        while (true)
        {
            var a = new A();                

            //here a goes out of scope but won't be collected by GC because Program still holds reference to "a" by a static event subsription
        }
    }      
    public class A
    {                       
        public A()
        {
            //if you comment this line, there is no reference from Program to A and a will be GC-ed and memory allocated will be released
            Program.SomeStaticEvent+=ProgramOnSomeStaticEvent;
        }
        private void ProgramOnSomeStaticEvent(object sender, EventArgs eventArg){}
    }

}

静的イベントへのサブスクリプション、または長期間存続するオブジェクトのイベントへのサブスクリプションには注意してください。あなたのプログラムはリークしており、その理由を見つけるのは簡単ではありません. オブジェクトが範囲外になる前に、常にそのようなイベントからサブスクライブを解除してください。

于 2013-05-01T17:56:30.247 に答える