Вы можете использовать GarbageCollector.GCMode, чтобы отключить сборку мусора во время выполнения. Это предотвращает всплески загрузки ЦП, но использование памяти вашим приложением никогда не уменьшается, поскольку сборщик мусора не собирает объекты, на которые больше нет ссылок.
Предупреждение. Отключение сборщика мусора требует тщательного управления памятью. Если вы невнимательно управляете памятью, управляемая куча постоянно расширяется до тех пор, пока у вашего приложения не закончится память, и операционная система не закроет его.
Вы можете использовать следующие API для тонкой настройки управления автоматическим сборщиком мусора:
-
System.GC.Collect
: выполняет полную сборку мусора с блокировкой. -
GarbageCollector.Mode.Disabled: полностью отключает сборщик мусора. Использование
System.Gc.Collect
в этом режиме не дает никакого эффекта. -
GarbageCollector.Mode.Manual: отключает автоматические вызовы сборщика мусора, но вы по-прежнему можете использовать
System.GC.Collect
для запуска полной коллекции. -
GarbageCollection.CollectIncremental
: Запускает сборщик мусора инкрементально.
Вы должны отключать сборку мусора только во время коротких, критичных к производительности частей вашего приложения, когда вы можете рассчитать и контролировать, сколько памяти вам нужно выделить. Вы должны немедленно включить сборщик мусора после этого и часто профилировать свой проект, чтобы убедиться, что вы не инициируете дополнительное управляемое выделение, которое может привести к тому, что управляемая куча станет слишком большой.
Когда вы отключаете сборщик мусора, это не останавливает ваше приложение для выполнения сборки мусора. Вызов System.GC.Collect
не имеет никакого эффекта и не запускает сбор. Чтобы избежать увеличения использования памяти с течением времени, вы должны соблюдать осторожность при управлении памятью. В идеале следует выделить всю память перед отключением сборщика мусора и избегать дополнительных выделений, пока он отключен.
Рекомендуется отключать сборщик мусора только для долгоживущих выделений. Например, вы можете захотеть выделить всю необходимую память для уровня вашей игры перед его загрузкой, а затем отключить сборщик мусора, чтобы избежать снижения производительности во время уровня. После завершения уровня и освобождения всей памяти можно снова включить сборщик мусора и использовать System.GC.Collect
для освобождения памяти перед загрузкой следующего уровня.
Дополнительные сведения о включении и отключении сборки мусора во время выполнения см. на странице GarbageCollector Scripting API.