3

全て、

OOM例外をスローするテストプロジェクトに問題があります。問題は私たちにあると思います。どういうわけか参照を保持していて、メモリが解放されることはありません。

そこで、メモリプロファイラーを実行して、これがどこで発生しているかを確認したいと思います。

プロファイラーツールのセットアップは、ツールをnunit-console.exeにポイントし、テストプロジェクトを実行して、いくつかのスナップショットを作成するだけです。

残念ながら、これは機能しません。私はSciTechとデモANTSの両方を試しましたが、どちらもNUnitコンソールアセンブリ/appdomain/何でも成長していないことを喜んで報告しています。素晴らしい。タスクマネージャーのプロセスは着実に450MBに成長しましたが、メモリプロファイラーはそれがまったく成長していないと報告しています。

素晴らしい。

私はグーグルで検索し、単体テストプロジェクトを処理する方法についていくつかの(ツール固有の)単純な手順を見てきました。私はそれらのことを試しましたが、うまくいきませんでした。NUnitのappdomain/assembly設定を試してみましたが、これまでのところ役に立ちません。

それで。

誰かが実際にテストプロジェクト(あらゆる種類の-NUnitを使用していますが、.NET自動テストフレームワークでも同じだと思います)に対してメモリプロファイラーを正常に実行しましたか?.NETテストフレームワークの場合は?もしそうなら、どの指示があなたのために働きましたか?

4

4 に答える 4

3

単体テストでアプリケーションのトラブルシューティングに問題が発生した場合 (使用するライブラリの一部は、単体テスト環境での実行を好みません)、単体テスト フレームワークと同じ順序でテスト メソッドを呼び出すコンソール アプリケーションを作成するだけです。次に、コンソール アプリでプロファイラーを開始します。

リークの原因を突き止めるために、すべてのテストを実行する必要はないかもしれません。

また、マネージ メモリ追跡ツールから常に見えるとは限らない、アンマネージ メモリのリークにも遭遇しました。特に管理されていないメモリを探す必要があります。これらは、多くの場合、Dispose() 呼び出しが欠落しているために発生します。

于 2011-11-09T20:12:33.377 に答える
0

私は最新バージョンの RedGate ANTS (v9.5.0.853) を使用しており、NUnit (v2.6.2) を介して .NET ライブラリを正しく (そして簡単に) プロファイルしました。

EXE を NUnit exe として起動するように設定する必要があります...そして、DLL (「Portal.Interface.dll」) の特定の機能をターゲットにしました。

新しいプロファイル セッションを作成しました。

  • .NET 実行可能ファイルへのパス: C:\Program Files (x86)\NUnit 2.6.2\bin\nunit-x86.exe
  • コマンド ライン引数: Portal.Interface.dll /fixture:Portal.Interface.Tests.TestSerializingSpeed
  • 作業ディレクトリ:

次に、最高のプロファイリング方法で実行しました。

それは私が期待していたリーク結果を生み出しました...

于 2016-10-26T02:09:09.200 に答える
0

JetBrains MemoryProfiler (私はバージョン 3.5 を使用しています) を試してみてください。NUnit (GUI バージョン) でうまく動作します!

于 2011-11-17T03:56:21.160 に答える
-1

アンマネージ メモリを含む、すべての種類の割り当てを考慮したことを確認しましたか?

ちなみに、OutOfMemoryException空きメモリがまったくない場合に必ずしもスローされるとは限りません。たとえば、大きな連続したメモリ ブロックを割り当てたい特定のクラスによってスローされることがありますStringBuilderXmlDocument.SelectNodesときどき投げます。

残念ながら、それはあなたがどうしようもないことです。アプリケーションがビジー状態の場合、ガベージ コレクターはその権限の範囲内でじっと座ってメモリの解放を拒否するため、割り当てる連続したブロックを見つけられない可能性が高くなります。

編集#1

私の記憶違いかもしれませんが (ビールのせいです)、あなたが観察している状況は、ガベージ コレクターがオブジェクトを解放したと報告しているにもかかわらず、OS のメモリ マネージャーがオブジェクトを完全に解放していないという事実によっても説明できます。以前占有されていたメモリ。.NET ガベージ コレクターよりも、自分が感じていることを実行する権利があります。この種の問題に対する最善の解決策は、大量の値の型を、最も目立つように割り当てようとするものを中心に設計することですSystem.String

于 2011-11-09T20:34:17.200 に答える