.NET2.0WindowsサービスアプリケーションでOutOfMemory例外のトラブルシューティングを行っています。この問題をよりよく理解するために、まず、OOM例外がスローされるまでArrayListを作成してOOM例外を生成する単純な.NETWinFormテストアプリを作成しました。例外がキャッチされてログに記録され、フォームボタンをクリックしてOOMEを再度実行できます。私が見つけた奇妙なことは、4回目の実行で、次のOOMEの前に消費されたメモリの量が約半分でした。以下にリストされている結果は、これを実行するたびに一貫しています。目を見張るようなタスクマネージャーも動作を確認します。残念ながら、より良い統計を取得しようとすると、Perfmonがフリーズしました。誰かが3回の実行後にメモリ制限が低下する理由を説明できますか?GCについての私の理解はかなり浅いです。さらに数回実行した後、GC.Collect()を実行したこともわかりますが、実行しませんでした。
更新:各arraylistアイテムにconst文字列と新しいオブジェクトを使用した場合にも大きな違いが見つかりました。コードは単純です:
const string TEST_TEXT = "xxxxxxxxxx";
ArrayList list = new ArrayList();
while (true)
{
list.Add(TEST_TEXT);
}
ループの開始:メモリ10,350,592
- OOM例外がスローされました
- アレイサイズ:134,217,728
エンドループ:メモリ550,408,192
ループの開始:メモリ550,731,776
- OOM例外がスローされました
- アレイサイズ:134,217,728
エンドループ:メモリ551,682,048
ループの開始:メモリ551,813,120
- OOM例外がスローされました
- アレイサイズ:134,217,728
エンドループ:メモリ551,772,160
ループの開始:メモリ551,903,232
- OOM例外がスローされました
- アレイサイズ:67,108,864
エンドループ:メモリ282,869,760
ループの開始:メモリ283,004,928
- OOM例外がスローされました
- アレイサイズ:67,108,864
エンドループ:メモリ282,910,720
GC.Collectを手動でトリガー
ループの開始:メモリ14,245,888
- OOM例外がスローされました
- アレイサイズ:67,108,864
エンドループ:メモリ283,344,896