- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用第 3 方 COM DLL 使用 C# 编写应用程序,此 dll 在非托管内存中创建大量资源(如位图、视频、数据结构)。在四处挖掘时,我遇到了以下对垃圾收集器的调用:
GC.AddMemoryPressure(long long bytesAllocated)
它记录在 MSDN 中:
http://msdn.microsoft.com/en-us/library/system.gc.addmemorypressure.aspx
这听起来像是我应该调用的东西,因为这个外部 dll 正在创建 CLR 不知道的大量资源。
我想我有两个问题...
最佳答案
在任何混合的 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/
C# AddMemoryPressure 调用是否会添加一个连接到它被调用的特定对象?我已经看到它在我们的性能跟踪中出现了很多,我想每 10MB 左右对调用进行一次批处理,但是如果它检查堆栈以将压力信
对非托管对象使用 Add/RemoveMemoryPressure 的正确方法是什么?我有一个非托管对象 - 但它大量使用了例如 STL 容器。我是否应该随着非托管对象总大小的每次变化不断更新托管 G
我在 MSDN 和 CLR via c# 上读到了这个问题。 假设我们有一个分配的 2Mb 非托管 HBITMAP 和一个指向它的 8 字节托管位图。如果它永远无法对对象做任何事情,那么用 AddMe
我正在使用第 3 方 COM DLL 使用 C# 编写应用程序,此 dll 在非托管内存中创建大量资源(如位图、视频、数据结构)。在四处挖掘时,我遇到了以下对垃圾收集器的调用: GC.AddMemor
项目:Java、JNI (C++)、Android。 我将通过创建一个托管包装类来管理 native C++ 对象的生命周期,该包装类将持有一个指向 native 对象的指针(作为长成员),并将在其重
我目前正在调试我们用来在系统中显示图像之前用特定文本标记图像的方法。 标签方法目前看起来像这样: private static Image TagAsProductImage(Image image)
已解决:原来受影响的机器安装了 .NET 4.5 beta。 我有一个使用 .NET4 的 C# 应用程序在对 的调用中无限期死锁/挂起 GC.AddMemoryPressure(12000000)
我们为一个用 C# 编写的多媒体匹配项目编写了一个自定义索引引擎。 索引引擎是用非托管 C++ 编写的,可以以 std:: 集合和容器的形式保存大量非托管内存。 每个非托管索引实例都被一个托管对象包装
我的 .NET 应用程序在很短的时间内使用了非常多的 RCW(不到一秒内使用了数千个 RCW)。我可以使用以下性能计数器来衡量此行为: - 处理 -> 处理计数 - .NET CLR 内存 -> #
我是一名优秀的程序员,十分优秀!