gpt4 book ai didi

c# - GC.GetTotalMemory(false) 和 Process.WorkingSet

转载 作者:行者123 更新时间:2023-12-02 07:35:26 28 4
gpt4 key购买 nike

在运行我的.net进程很长时间后,我发现GC感知的内存和进程工作集之间存在很大差异。

我正在监视的值是 GC.GetTotalMemory(false) 和 Process.WorkingSet。

如果我检查“任务管理器”(或使用 SysInternals 工具),WorkingSet(进程)的值与“任务管理器”中显示的值不匹配,但它们在某种程度上接近(比方说,100mb)在任务管理器中,WorkingSet 中为 130),但令我震惊的是 GC.GetTotalMemory(false) 大约为 40Mb 左右。

我已经通过探查器运行了几次(我最喜欢的是 ants memory profiler from redgate ),在那里很容易检查是否有一个名为“空闲内存”的值,该值通常是 GC“看到”的内容与实际情况之间的差异。操作系统看到(好的,加上加载的 DLL 等等)。

几个问题:

  • 有没有办法以编程方式监视这个“GC 空闲内存”。是的,我可以使用探查器,但在长时间运行的过程中并不那么容易。

  • 如果你的进程运行了很长一段时间,分配了大量内存然后释放它(分配意味着数千或数百万个对象,而不是像大分配和释放那么简单),问题在于它尽管 GC 值较低且正确,但它永远不会“收缩”到较低值。有没有办法来解决这个问题?可能是我的流程中出现了某些问题,但这些年来已经对其进行了多次分析,看起来并不是泄漏。

谢谢

最佳答案

只是为了复活一个古老的线程,如果你想监控“GC空闲内存”,你可以定期调用GC.GetTotalMemory(false)并存储值(value)。将其转储到磁盘或数据库或其他东西。或者,您可以使用像 prometheus-net ( https://github.com/prometheus-net/ ) 这样的库,它将为您导出此数据和一大堆指标。

关于你的第二个问题,有一种方法可以强制你的应用程序缩小,但它不是 dot net native 的,它只是 Windows 的,并且推荐:

[DllImport("psapi.dll")]
static extern int EmptyWorkingSet(IntPtr hwProc);

static void MinimizeFootprint()
{
EmptyWorkingSet(Process.GetCurrentProcess().Handle);
}

据我所知,我认为如果服务器面临内存压力,操作系统会处理这个问题,并且如果内存仍然分配给您的进程,那么它对您的应用程序和一般服务器来说会更有效。这是因为将来很有可能再次需要它,因此当它只需要再次分配它时,清理它是没有意义的,特别是当您的服务器有足够的内存时。

关于c# - GC.GetTotalMemory(false) 和 Process.WorkingSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4909951/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com