【问题标题】:Take .NET snapshots without forcing GC collection在不强制 GC 收集的情况下拍摄 .NET 快照
【发布时间】:2021-09-10 07:00:10
【问题描述】:

我有一个部署在生产环境中的应用程序,有时它会开始消耗大量 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。

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

【问题讨论】:

    标签: .net profiling dotmemory


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-22
      • 2015-09-28
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多