如何强制垃圾收集器移动内存中的对象

时间:2015-06-18 16:56:42

标签: c# garbage-collection

为了测试与非托管代码交互的一些场景,我需要强制GC在内存中移动一个对象。

我有以下代码来测试对象移动。应在somehow force gc to move mc部分编写哪些代码,以便在控制台上打印两个不同的地址?

[StructLayout(LayoutKind.Sequential)]
class MyClass
{
    public int i;
}

class Program
{
    static void Main(string[] args)
    {
        MyClass mc = new MyClass();

        // print address of mc
        var handle = GCHandle.Alloc(mc, GCHandleType.Pinned);
        Console.WriteLine(handle.AddrOfPinnedObject());
        handle.Free();

        // somehow force gc to move mc

        // print new address of mc
        handle = GCHandle.Alloc(mc, GCHandleType.Pinned);
        Console.WriteLine(handle.AddrOfPinnedObject());
        handle.Free();
    }
}

1 个答案:

答案 0 :(得分:0)

我有类似的问题"我提出了一个"解决方案"。我知道这段代码很奇怪,不应该投入生产,但是当你想要确保你的互操作代码正确处理内存重新分配时,它就足够了。

var firstData = new int[10000];
var data = new int[50];

GCHandle handle;

handle = GCHandle.Alloc(data, GCHandleType.Pinned);
Console.WriteLine(handle.AddrOfPinnedObject());
handle.Free();

firstData = null;
GC.AddMemoryPressure(10000000);
GC.Collect();
GC.RemoveMemoryPressure(10000000);

handle = GCHandle.Alloc(data, GCHandleType.Pinned);
Console.WriteLine(handle.AddrOfPinnedObject());
handle.Free();