为了将对象的实例传递给GC.AddMemoryPressure
方法,使用了 C# 语言的哪些机制?
我通过 C# book在CLR中遇到了以下代码示例:
private sealed class BigNativeResource {
private readonly Int32 m_size;
public BigNativeResource(Int32 size) {
m_size = size;
// Make the GC think the object is physically bigger
if (m_size > 0) GC.AddMemoryPressure(m_size);
Console.WriteLine("BigNativeResource create.");
}
~BigNativeResource() {
// Make the GC think the object released more memory
if (m_size > 0) GC.RemoveMemoryPressure(m_size);
Console.WriteLine("BigNativeResource destroy.");
}
}
我不明白我们如何将一个对象的实例与它所增加的压力联系起来。我没有看到对象引用被传递给GC.AddMemoryPressure
. 我们是否将增加的内存压力 (amp) 与对象相关联?
另外,我看不出有任何理由调用GC.RemoveMemoryPressure(m_size);
. 从字面上看,它应该没有用。让我自己解释一下。有两种可能:对象实例之间存在关联,或者没有这种关联。
在前一种情况下,GC 现在应该m_size
确定优先级并决定何时进行收集。因此,它绝对应该自行消除内存压力(否则 GC 对 GC 意味着什么remove an object while taking into an account the amp
?)。
在后一种情况下,根本不清楚添加和移除放大器的用途。GC 只能使用定义为类实例的根。即GC只能收集对象。因此,如果对象和放大器之间没有关联,我看不出放大器如何影响 GC(所以我假设存在关联)。