gpt4 book ai didi

c# - (几乎)所有垃圾收集都是完全收集

转载 作者:行者123 更新时间:2023-12-02 12:57:22 31 4
gpt4 key购买 nike

在大约四天的时间里,我一直在收集托管应用程序的性能计数器。在此期间,发生了以下垃圾回收:

  • 第 0 代:133,695
  • 第一代:133,413
  • 第 2 代:133,254

其中一些是使用GC.Collect()“诱导”的完整集合。四天内共有 323 个。

为什么我的所有(或基本上所有)收藏都是完整收藏?我猜测这种情况导致“GC 时间百分比”计数器非常高(高达 70%,即使分配的字节/秒显着下降)。

根据配置文件,我正在运行 .NET 4.0(64 位)并使用服务器 GC,这一点可能很重要,也可能不重要。

最佳答案

I'm allocating large amounts of memory (upwards of 300 MB/sec at times)

这足以解释您所观察到的情况。这将在那一秒内触发大量收集,第 0 代和第 1 代堆并没有那么大。这些世代中的对象很有可能仍在使用中,因为它们刚刚被分配,因此第 0 代和第 1 代集合没有提供足够的空间,几乎每个对象都被提升到第 2 代。 GC对此有一个对策,它会自动增加生成大小。但这无法满足您对内存的贪婪渴望。您可以使用 Perfmon.exe 中的 .NET 内存性能计数器来观察这一点。任何 .NET 内存分析器都可以通过更漂亮的图表为您提供洞察力。

以如此高的速率分配内存并不容易,您必须分配大量数组。这本身就可以解释这一点,大于 85,000 字节的数组被分配在大对象堆中。寻找重用这些数组的方法。几乎所有 .NET 集合类都在底层使用数组。

关于c# - (几乎)所有垃圾收集都是完全收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16678748/

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