2017-03-13 8 views
1

いくつかのNUnitテストをデバッグしているときに、スクリプトファイルを使用してlocaldbにローを挿入するときにメモリリークが検出されました。これはSystem.OutOfMemoryExceptionに至り、開発中に単体テストを実行するのを止めています。localdbでのNUnitテスト中のSystem.OutOfMemoryException

コード次のようになります。

Heap memory step-through

::私たちのクエリ我々は

1) right after entering the inner try/catch 
2) is after conn.open 
3) is after cmd.ExecuteNonQuery 
4) is after the conn.Close in the finally block 

私はこれらのヒープの値を取得するコードをステップ実行すると

public static void InsertFromScriptFile (string conString, string dbName, string filePath) 
{ 
    using (SqlConnection conn = new SqlConnection(string.Format(conString, dbName))) 
    { 
     string script = File.ReadAllText(filePath); 

     using (SqlCommand cmd = new SqlCommand(script, conn)) 
     { 
     try 
     { 
       conn.Open() 
       cmd.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine(ex); 
      throw ex; 
     } 
     finally 
     { 
      conn.Close(); 
     } 
     } 
    } 
} 

いくつかの行をデータベースに挿入します。 base64文字列としてドキュメントを挿入すると、これらのエラーが発生し始めました。

約10回のテスト後にヒープ内のオブジェクトを検査すると、ドキュメントオブジェクトへの参照だけでなく、成長しているTdsParserStateObjectのように見えます。

TdsParserStateObject

は各TestFixture後、私たちはlocaldbをドロップし、新しいものを作成します。私たちはある時点でメモリがgcによって再利用されることを期待しましたが、それは成長を続けています。誰かがなぜメモリが再利用されないのか考えているのですか?

+0

ここにEntity Frameworkはありますか? – Evk

+0

申し訳ありませんが、文言が変更されました。テスト中にefを使用してデータを読み込みます。 – Joalon

答えて

0

回避方法が見つかりました。私たちは、シードが必要なすべてのテストで作成したlocaldbインスタンスに割り当てられているメモリを追跡しました。これらのインスタンスは、テストケースの後に名前が付けられました。それらの名前をすべて同じ名前に変更し、テストを順番に実行した(テストが互いに干渉しないように)ために、メモリは1つのインスタンスにのみ割り当てられました。

関連する問題