0

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

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

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

有没有我可以使用的这个或其他工具的解决方法?

4

1 回答 1

1

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

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

于 2021-09-16T08:37:22.067 回答