garbage-collection - 防止 CLR 中早期垃圾回收的最佳方法

标签 garbage-collection clr

我编写了一个托管类,它包装了一个非托管 C++ 对象,但我发现 - 当在 C# 中使用它时 - 当我在该对象上执行方法时,GC 会提前启动。我已经阅读了有关垃圾收集以及如何防止垃圾收集过早发生的内容。一种方法是使用“using”语句来控制对象何时被释放,但这将责任归于托管对象的客户端。我可以添加到托管类:

MyManagedObject::MyMethod() {

<pre><code>System::Runtime::InteropServices::GCHandle handle = System::Runtime::InteropServices::GCHandle::Alloc(this); // access unmanaged member handle.Free(); </code></pre> <p>}</p>

这似乎有效。作为 .NET 的新手,其他人如何处理这个问题?

谢谢,

约翰

最佳答案

您可能想看看这篇文章:http://www.codeproject.com/Tips/246372/Premature-NET-garbage-collection-or-Dude-wheres-my 。我相信它准确地描述了您的情况。简而言之,补救措施要么是 using block ,要么是 GC.KeepAlive。然而,我同意,在许多情况下,您不希望将此负担传递给非托管对象的客户端;在这种情况下,在每个包装器方法末尾调用 GC.KeepAlive(this) 是一个很好的解决方案。

关于garbage-collection - 防止 CLR 中早期垃圾回收的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2725364/

相关文章:

javascript - V8 GC何时触发其第一个次要GC周期(清理)?

c# - 垃圾回收如何处理对象引用?

c# - 什么时候评估内插字符串?

.net - .NET CLR 何时评估安全属性?

python - 如何调试在 Python 中使用的 Windows DLL?

c# - 数组在 CLR 中有直接支持

java - 类似于 yourkit 的工具?

python - 如何找出代码中存在哪些特定的循环引用

java - 大量数据删除

c# - C++/CLI clr :safe for C# COM Interop 中的包装器 C++