[英]Saxon memory not being released
我在释放Saxon用于将文件加载到内存中使用的内存时遇到问题。 这是我们的代码的简化版本:
Task newTask = Task.Run(() =>
{
Processor processor = new Processor();
DocumentBuilder documentBuilder = processor.NewDocumentBuilder();
documentBuilder.IsLineNumbering = true;
documentBuilder.WhitespacePolicy = WhitespacePolicy.PreserveAll;
XQueryCompiler compiler = processor.NewXQueryCompiler();
string query = BuildXqueryString();
if (!String.IsNullOrEmpty(query))
{
XQueryExecutable executable = compiler.Compile(query);
XQueryEvaluator evaluator = executable.Load();
evaluator.ContextItem = documentBuilder.Build(xmlNode);
var evaluations = evaluator.Evaluate();
}
}
我们正在Task
中运行代码,因为我们同时进行了许多评估,其中许多评估使用的XML文件最大为2GB。 因此,我们需要尽快执行Build()
方法时由Saxon使用的内存,但实际上是垃圾回收器没有完全回收该内存。 每次评估后,内存使用量都会上升并增加,并且永远不会完全释放,因此在进行了几次这样的大型评估后,内存使用量已达到最大值。 我尝试调用Task
的Dispose()
方法,将所有变量设置为null,但似乎没有任何效果。 有什么想法会发生什么吗?
编辑:
谢谢大家的答案。 我意识到这个问题实际上不在撒克逊人的代码中,而是与不释放内存的XmlDocument有关。 对困惑感到抱歉。
检查在任务中使用的实例的任何类是否是可丢弃的,它们是否可以保留资源,直到显式调用dispose(在完成其工作之后)。 还using
块结帐。
还从官方文档中指出:
应用程序需要做的第一件事是创建一个处理器。 处理器保存Saxon的配置信息以及共享资源,例如名称池和架构池。 如果需要,可以同时运行多个处理器,但是通常单个应用程序中的所有Saxon进程使用同一处理器更为经济。
那么如何对所有任务使用相同的处理器实例呢? 如果使用缓存的资源,它可能会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.