GarbageCollector.GCMode
Declaration
public static Scripting.GarbageCollector.Mode GCMode;Описание
Установить и получить глобальный режим работы сборщика мусора.
Установка глобального режима работы изменяет поведение сборщика мусора для всего приложения.
Не поддерживается на платформе WebGL и в Редакторе.
Рекомендуется изменять режим работы сборщика мусора только на уровне приложения и не изменять его в библиотеках сторонних разработчиков.
Подписаться на событие GarbageCollector.GCModeChanged, чтобы получать уведомления при изменении режима сборщика мусора.
Отключение сборщика мусора Отключение сборщика мусора путем назначения GarbageCollector.Mode.Disabled полностью отключает сборщик мусора. Это означает, что поток сборщика мусора никогда не остановит ваше приложение для выполнения сбора. Кроме того, вызов System.GC.Collect() не будет иметь никакого эффекта и не запустит сбор. Отключение сборщика мусора должно производиться с большой осторожностью, поскольку непрерывные выделения после отключения сборщика мусора приведут к непрерывному увеличению использования памяти.
Рекомендуется отключать сборщик мусора только для долгосрочных выделений. Например, в игре вы должны выделить всю необходимую память для уровня, а затем отключить сборщик мусора, чтобы избежать дополнительных затрат во время уровня. После завершения уровня и высвобождения всей памяти, сборщик мусора может быть вновь включён, и System.GC.Collect() может быть вызван для восстановления памяти перед загрузкой следующего уровня.
Управление сборщиком мусора вручную Вы можете установить GCMode на GarbageCollector.Mode.Manual. Это отключает автоматические вызовы сборщика мусора, но всё равно позволяет выполнять сбор мусора вручную. Ручной сбор позволяет вам контролировать, когда происходит сбор мусора, чтобы вы могли настроить плавность вашего контента или использование памяти. Вызов либо System.GC.Collect() для полного блокирующего сбора, либо GarbageCollector.CollectIncremental для выполнения постепенного сбора мусора.
Дополнительные ресурсы: GarbageCollector.Mode.Enabled, GarbageCollector.Mode.Disabled, GarbageCollector.Mode.Manual.
using System; using UnityEngine; using UnityEngine.Scripting;
public class GarbageCollectorExample { static void ListenForGCModeChange() { // Listen on garbage collector mode changes. GarbageCollector.GCModeChanged += (GarbageCollector.Mode mode) => { Debug.Log("GCModeChanged: " + mode); }; }
static void LogMode() { Debug.Log("GCMode: " + GarbageCollector.GCMode); }
static void EnableGC() { GarbageCollector.GCMode = GarbageCollector.Mode.Enabled; // Trigger a collection to free memory. GC.Collect(); }
static void DisableGC() { GarbageCollector.GCMode = GarbageCollector.Mode.Disabled; } }
Использование GCMode API.
using System; using UnityEngine; using UnityEngine.Profiling; using UnityEngine.Scripting;
public class GCManualControl : MonoBehaviour { // Perform an incremental collection every time we allocate more than 8 MB const long kCollectAfterAllocating = 8 * 1024 * 1024;
// Perform an instant, full GC if we have more than 128 MB of managed heap. const long kHighWater = 128 * 1024 * 1024;
long lastFrameMemory = 0; long nextCollectAt = 0;
void Start() { // Set GC to manual collections only. GarbageCollector.GCMode = GarbageCollector.Mode.Manual; }
void Update() { long mem = Profiler.GetMonoUsedSizeLong(); if (mem < lastFrameMemory) { // GC happened. nextCollectAt = mem + kCollectAfterAllocating; } if (mem > kHighWater) { // Trigger immediate GC System.GC.Collect(0); } else if (mem >= nextCollectAt) { // Trigger incremental GC UnityEngine.Scripting.GarbageCollector.CollectIncremental(); lastFrameMemory = mem + kCollectAfterAllocating; } lastFrameMemory = mem; } }
Ручное управление GC с помощью GarbageCollector.Mode.Manual.