3

アプリケーションを実行すると、メモリ使用量が常にすぐに増加し、メモリの解放が遅くなります。windbg ツールを使用してメモリ ダンプを確認すると、system.bytes[]が多くのメモリを使用していることがわかりました。

以下は私の擬似コードです:

ファイルを開く

//read a html file in disk
var stream = OpenFile();//
//de-compress in gzip mode
var de_stream = GZip_Decompress(stream);            
stream.close();
var doc=LoadHtml(de_stream,Encoding.Utf8);
//close a close
de_stream.close();

HTML文字列をロードする

関数 LoadHtml(ストリーム、エンコード)

var doc = new HtmlDocument();
using (var sr = new StreamReader(stream, encoding, false,4096))
{
    var html = sr.ReadToEnd();
    doc.LoadHtml(html);
    sr.Close();
}

私のアプリケーションが実行され、何百ものファイルを開くと(ファイルの平均長は100Kです)

$dumpheap -stat

ここに画像の説明を入力

$dumpheap -mt 56394944 -min 10240

ここに画像の説明を入力 mt 56394944 の最後のオブジェクトをチェックします。

!do 3d67a240

ここに画像の説明を入力

MT 56394944 の他のオブジェクトも html コンテンツです。ストリームを閉じたときに、バイト配列のオブジェクトがまだメモリに保持されていますか?

上記のコードを変更してLoadHtml関数呼び出しを削除すると、すべて問題なく、メモリ使用量が高くならず、バイト配列内のオブジェクトがメモリに保持されません。

var stream = OpenFile();
var de_stream = GZip_Decompress(stream);            
stream.close();
//var doc=LoadHtml(de_stream,Encoding.Utf8);remove this call
de_stream.close();

HTMLファイルをロードしたときにバイト配列オブジェクトを解放するという提案が必要です。

[編集] !gcroot [バイト配列アドレス]を使用する場合、出力はありません。

....
Object 0x188b0cb8 contains an invalid object reference 0x1e7538f8.
Scan Thread 25 OSTHread f40
Scan Thread 26 OSTHread 8e8
....    
Scan Thread 30 OSTHread 16e0
Object 0x237115f8 contains an invalid object reference 0x24866df8.
....

[編集]

私はGCスタティックをチェックしました。 ここに画像の説明を入力

4

0 に答える 0