gpt4 book ai didi

c# - 如何确定 GC.AddMemoryPressure() 的适当参数?

转载 作者:太空狗 更新时间:2023-10-29 21:11:11 25 4
gpt4 key购买 nike

我正在使用第 3 方 COM DLL 使用 C# 编写应用程序,此 dll 在非托管内存中创建大量资源(如位图、视频、数据结构)。在四处挖掘时,我遇到了以下对垃圾收集器的调用:

GC.AddMemoryPressure(long long bytesAllocated)

它记录在 MSDN 中:

http://msdn.microsoft.com/en-us/library/system.gc.addmemorypressure.aspx

这听起来像是我应该调用的东西,因为这个外部 dll 正在创建 CLR 不知道的大量资源。

我想我有两个问题...

  1. 当 dll 是第 3 方时,我如何知道要添加多少内存压力,而且我不可能确切知道此 dll 分配了多少内存。
  2. 这样做有多重要?

最佳答案

在任何混合的 native /托管进程中,都会混合使用 native /托管内存。如果两者之间没有GC控制的关系,那么就不需要这个API了。例如,如果托管代码中存在某些确定性状态变化导致 native 内存被分配和释放,那么 GC 无法执行的任何操作都不会强制释放 native 内存。

但是,通常有本地内存由具有终结器的托管对象持有。因此,GC 可以减少 native 堆的大小,只需触发收集并让这些终结器运行即可。

因此,如果您有很多这样的事情要做,那么很可能有必要调用此 API(就像文档中所说的那样)。

至于你应该告诉它多少,这可能不是你可以通过纯粹的分析来得出答案的,尤其是在第 3 方库中。您需要运行性能监视器,运行分配大量第 3 方对象的测试,并查看 native 字节数和 CLR 内存计数器以了解它们之间的关系。

当您使用 COM 对象时,您实际上可以通过使用 Marshal.ReleaseComObject 确定性地强制实例在您知道不再需要它们时进行清理。 .请注意,您需要使用一个愚蠢的循环来摆脱对象:

while (Marshal.ReleaseComObject(obj) != 0) 
{
}

关于c# - 如何确定 GC.AddMemoryPressure() 的适当参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2618045/

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