使用C#语言的哪些机制将对象的实例传递给GC.AddMemoryPressure
方法?
我在通过C#通过CR书中遇到了以下代码示例:
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达到remove an object while taking into an account the amp
意味着什么?)。
在后一种情况下,还不清楚添加和删除放大器的用途。 GC只能使用根(根据定义是类的实例)的根。即GC仅可以收集对象。因此,如果对象与放大器之间没有关联,则我看不到放大器会如何影响GC(因此我认为存在关联)。
使用C#语言的哪些机制将对象的实例传递给GC.AddMemoryPressure方法?我通过C#书在CLR中遇到了以下代码示例:私有密封类...
这些方法的存在是为了让GC知道托管堆之外的内存使用情况。没有对象可以传递给这些方法,因为内存与任何特定的托管对象都不直接相关。代码的作者有责任正确通知GC有关内存使用的更改。