版本: Unity 6 (6000.0)
语言English
  • C#

GarbageCollector.GCMode

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交,但我们确实阅读了用户提出的每个建议更改,并在适用的情况下进行更新。

关闭

提交失败

由于某些原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

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.EnabledGarbageCollector.Mode.DisabledGarbageCollector.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; } }

使用 GarbageCollector.Mode.Manual 进行手动 GC 控制。