日々精進

新しく学んだことを書き留めていきます

DataSetでメモリリーク

下のようなコードで変数dsが保持しているDataSetのメモリが解放されないといいう問題が起きました。

    for (int i = 0; i <= n; i++)
    {
        TestDataSet ds = this.GetFromDB(i);
        foreach (TestDataSet.DataRow row in ds.DataTable)
        {
            this.Calc(row.id, row.amount);
        }
        ds.Dispose();
        ds = null;
        System.GC.Collect();
    }

Disposeしてるし、null渡して参照を切ってあるし、Calc関数にはプリミティブ型しか渡してないのでCalc関数の中で他の変数がrowへの参照を持ってしまっているという可能性はないし。。と困ってました。

が、以下の用にClearメソッドを使用するとメモリが解放されるようになりました!

    for (int i = 0; i <= n; i++)
    {
        TestDataSet ds = this.GetFromDB(i);
        foreach (TestDataSet.DataRow row in ds.DataTable)
        {
            this.Calc(row.id, row.amount);
        }
        ds.Clear();
        ds = null;
        System.GC.Collect();
    }

Clearメソッドの詳しい仕様を調べてみないとわからないけど、DataSetのどこかで自分への参照を持っていたのでメモリが解放されなかったのかな?
DataSetはメモリリークを起こしやすいらしいので注意しないと。