在不强制 GC 收集的情况下获取 .NET 快照

Take .NET snapshots without forcing GC collection

我有一个部署在生产环境中的应用程序,有时它开始消耗大量 RAM。为了能够分析和弄清楚为什么内存在某一时刻消耗了这么多,我想我会为此使用 dotMemory CLI 分析工具。

我将 dotMemory 附加到进程,然后使用 ##dotMemory["get-snapshot", {pid:12345}]

但是,当应用程序(在本例中为 .NET 4.5 中的 Web API)从 1.7GB(标准)增加到 2.5GB 或更多时,一旦我执行 get-snapshot,dotMemory 似乎强制进行垃圾回收,最终将占用的内存清除回 cca 1.7GB。考虑到它通常不会在不重新启动的情况下停机这一事实,dotMemory 并不是很有帮助,因为我得到的快照是在垃圾收集之后,这意味着我无法弄清楚是什么占用了那么多 RAM。

是否有针对此工具或我可以使用的其他工具的解决方法?

您可以使用进程资源管理器获取 Windows 内存转储,或使用 dotnet.exe 获取 .NET 内存转储,具体取决于您的应用程序 运行 的 .NET 框架版本。然后您可以在 dotMemory 或任何其他合适的应用程序中对其进行分析。

不过我还有一个补充。 dotMemory 强制执行标准 .NET 垃圾收集 (GC) 过程并降低应用程序的内存消耗意味着对对象的引用已被清除但未执行 GC。很可能这意味着计算机上有足够的内存,GC 算法决定暂时不要收集内存。它针对应用程序性能进行了优化,而不是为了在不需要的情况下保持低内存消耗。用两个词 - 你的情况不是问题,GC 有权决定何时执行收集。