3

我有很多 html 文件需要通过 HtmlAgilityPack 读取和解析。当运行应用程序时,内存使用量总是会立即增加并且释放内存很慢。当我使用 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