だから私は2000のようなオブジェクトを作成するアプリケーションを持っています。
オブジェクトごとに、Webページ(約75kbの文字列)をダウンロードし、htmlツリー全体のDOMドキュメントオブジェクトモデルを作成し、文字列を破棄します(範囲外になります)。
次に、DOMからいくつかのテキストとリンクを抽出し、DOMを破棄します(nullに設定することにより)。
約1000個のオブジェクトの後(開いているアプリケーションの量によっては、50個のオブジェクトの後になる場合があります)、OutOfMemory例外が発生し、Process Explorerを使用すると、メモリフットプリントが対数ステップで全体的に増加していることがわかります。
nullに設定してから挿入してみましSystem.gc();
たが、メモリ使用量は増え続けていますが、対数ステップではなく、処理されたオブジェクトごとに約0.5Mbのステップがあります。さらに、デバッグ中はSystem.gc()
、フットプリントをステップオーバーするたびにこの量だけ増加し、命令ポインターがSystem.gc()
再び同じになるまで同じままになります。
[編集]
回答で提案されているように、ダンプでプロファイルを実行したところ、これらのクラスのすべてに150kbの文字列(75k文字)がまだ格納されていることがわかりました。これは合計242mbです。したがって、問題は、元の文字列を保持せずにサブ文字列を保持するにはどうすればよいかということです。どうやらStringコンストラクターがこれを行っているようです。