使用C#语言的哪些机制将对象的实例传递给GC.AddMemoryPressure方法?

问题描述 投票:0回答:1

使用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中遇到了以下代码示例:私有密封类...

c# memory-management garbage-collection memory-pressure
1个回答
0
投票

这些方法的存在是为了让GC知道托管堆之外的内存使用情况。没有对象可以传递给这些方法,因为内存与任何特定的托管对象都不直接相关。代码的作者有责任正确通知GC有关内存使用的更改。

© www.soinside.com 2019 - 2024. All rights reserved.