如何处理 Visual Studio 内存堆快照中的异常?

How do I deal with the exceptions in my Visual Studio memory heap snapshot?

我刚开始尝试优化 Visual Studio 中的内存使用。我的 C#.NET 自动化应用程序的内存使用量迅速增加,我想防止这种情况发生。我在第一次启动时拍了一张堆快照,然后在内存变高时拍了一张。但是我真的不知道如何处理我在 diff 中看到的这些东西。

我特别关心的是 COMExceptionsElementNotAvailableExceptions。我了解这些异常是什么,但我不明白为什么我的 RAM 中有这么多异常或如何减少该数量。 ElementNotAvailableExceptions 每个都被捕获在各自的函数中,因此应该在函数完成后立即从内存中消失,对吧?我不会将它们保存到静态变量或类似的任何疯狂的东西。我当然也不会保存 COMExceptions。为什么这些东西会在我的堆快照中占用这么多内存?

还有,ConcurrentStack + Node <Object>到底是什么?我从来没有在我的代码中使用术语 ConcurrentStack 并且在扩展它时看不到任何我理解的东西。占用这么多内存怎么办?

编辑: 这是为 ElementNotAvailableExceptions 显示的 Paths to root,这似乎没有帮助告诉我任何有价值的东西。

我一直不明白为什么 ElementNotAvailableException 会留在 RAM 中(当它被封装在一个函数中时,垃圾收集会定期运行,我并不是故意将它们保存到静态变量中)。但是我确实通过确保每个 AutomationElement 在尝试获取其子项或兄弟姐妹或其他任何东西之前都不为空来解决了我的 RAM 问题(而不是像我所做的那样只是尝试捕获这些异常,然后移动在我的代码中)。

if (myAutomationElement != null)
{
    AutomationElement parent = walker.GetParent(myAutomationElement);
}