using System.Runtime; using System.Runtime.CompilerServices; var buffers = Make(); Snapshot("allocated"); for (int i = 0; i < buffers.Length; i += 2) buffers[i] = null; GC.Collect(2, GCCollectionMode.Forced, blocking: true, compacting: false); Snapshot("after-sweep"); GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; GC.Collect(2, GCCollectionMode.Forced, blocking: true, compacting: true); Snapshot("after-compact-request"); Console.WriteLine($"kept:{buffers.Count(b => b is not null)}"); GC.KeepAlive(buffers); [MethodImpl(MethodImplOptions.NoInlining)] static byte[]?[] Make() => Enumerable.Range(0, 24).Select(_ => (byte[]?)new byte[100_000]).ToArray(); static void Snapshot(string label) { var i = GC.GetGCMemoryInfo(); Console.WriteLine($"{label}:index={i.Index};heap={i.HeapSizeBytes};fragmented={i.FragmentedBytes};committed={i.TotalCommittedBytes}"); }