我在释放内存方面遇到问题,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
内部运行代码,因为我们正在同时进行大量的评估,其中许多都使用最大2GB的XML文件。出于这个原因,我们需要Saxon在执行尽快发布的Build()
方法时使用的内存,但是发生的事情是垃圾收集器没有完全回收内存。在每次评估之后,内存使用量会上升和上升,并且永远不会被完全释放,因此通过几次大的评估,内存使用率会上升到最大值。我尝试调用Dispose()
Task
方法,将所有变量设置为null,但似乎没有任何效果。有什么想法会发生什么?
编辑:
谢谢大家的回答。我意识到这个问题实际上并不在Saxon代码中,而是在XmlDocument中没有释放内存。对不起,感到困惑。
答案 0 :(得分:0)
检查在任务中使用的任何类的任何类是否是一次性的,它们可能持有资源,直到显式调用dispose(在完成其工作之后)。还要结帐using
块。
应用程序需要做的第一件事是创建一个处理器。 处理器保存Saxon的配置信息并共享 名称池和模式池等资源。它可以运行 如果需要,可以同时使用多个处理器,但通常更多 在单一应用中使用所有Saxon工艺都是经济的 相同的处理器。
那么如何为所有任务使用相同的处理器实例呢?如果它使用缓存资源,它可以提供帮助。