Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何强制垃圾收集器移动内存中的对象_C#_Garbage Collection - Fatal编程技术网

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

C# 如何强制垃圾收集器移动内存中的对象,c#,garbage-collection,C#,Garbage Collection,为了测试一些与非托管代码交互的场景,我需要强制GC在内存中移动一个对象 我有以下代码来测试对象的移动。在部分中应该编写什么代码,以某种方式强制gc移动mc,以便将两个不同的地址打印到控制台 [StructLayout(LayoutKind.Sequential)] class MyClass { public int i; } class Program { static void Main(string[] args) { MyClass mc = n

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

我有以下代码来测试对象的移动。在
部分中应该编写什么代码,以某种方式强制gc移动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();
    }
}
我也有类似的“问题”,我想出了一个“解决方案”。我知道这段代码很奇怪,永远不应该投入生产,但当您希望确保互操作代码正确处理内存重新分配时,它足以进行测试

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();
我也有类似的“问题”,我想出了一个“解决方案”。我知道这段代码很奇怪,永远不应该投入生产,但当您希望确保互操作代码正确处理内存重新分配时,它足以进行测试

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();

你不能。通过设计,GC抽象出对内存管理的控制。它的全部目的是防止您对内存的管理方式进行细粒度控制。您应该避免使用它。有两个专门的MDA用于此目的,明确旨在清除此类错误。你不能。通过设计,GC抽象出对内存管理的控制。它的全部目的是防止您对内存的管理方式进行细粒度控制。您应该避免使用它。有两个专门的MDA用于此目的,明确旨在清除此类错误。你不能。通过设计,GC抽象出对内存管理的控制。它的全部目的是防止您对内存的管理方式进行细粒度控制。您应该避免使用它。有两个专门的MDA用于此目的,明确旨在清除此类错误。