我有很多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字符串
function LoadHtml(stream,encoding)
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静态。