Вы знаете, я несколько сомневаюсь в профилировщике памяти здесь.Система управления памятью в .NET на самом деле пытается дефрагментировать для вас кучу, перемещая память (поэтому вам нужно закрепить память для ее совместного использования с внешней DLL).
Большие выделения памяти занимают больше временипериоды времени подвержены большей фрагментации.В то время как небольшие эфемерные (короткие) запросы памяти вряд ли могут вызвать фрагментацию в .NET.
Здесь также стоит подумать.В текущем GC .NET память, расположенная близко во времени, обычно расположена близко друг к другу в пространстве.Что является противоположностью фрагментации.т.е. вы должны распределять память так, как вы намереваетесь получить к ней доступ.
Это только управляемый код или он содержит такие вещи, как P / Invoke, неуправляемую память (Marshal.AllocHGlobal) или что-то вроде GCHandle.Alloc (obj)., GCHandleType.Pinned)?