包含此页的版本:
不含此页的版本:
Unity 使用垃圾回收器从您的应用程序和 Unity 不再使用的对象中回收内存。当脚本尝试对托管堆进行分配,但没有足够的可用堆内存来容纳分配时,Unity 会运行垃圾回收器。
当垃圾回收器运行时,它会检查托管堆中的所有对象,并标记应用程序不再引用的任何对象以删除。然后,Unity 会删除未引用的对象,从而释放内存。理想情况下,释放的内存可以容纳新的分配,如果不能,堆就会增长,Unity 会为其分配额外的内存块。
垃圾回收器以相同的方式处理后续请求,直到没有足够大的可用区域来分配所需的块大小。在这种情况下,所有分配的内存不太可能仍在使用中。Unity 的脚本后端为Unity中的脚本提供支持的框架。Unity 支持三种不同的脚本后端,具体取决于目标平台:Mono、.NET 和 IL2CPP。但是,通用 Windows 平台仅支持两个:.NET 和 IL2CPP。更多信息
请参阅术语表只能访问堆上的引用项,只要仍有引用变量可以找到它。
为了确定哪些堆块不再使用,垃圾回收器会搜索所有活动引用变量,并将它们引用的内存块标记为活动。在搜索结束时,垃圾回收器会将活动块之间的任何空间视为空,并标记它们以用于后续分配。定位和释放未使用内存的过程称为垃圾回收 (GC)。
注意:垃圾回收器在 Web 平台上的工作方式不同。有关更多信息,请参阅 Web 垃圾回收中的内存注意事项。
应用程序通常会在每一帧中将临时数据分配给托管堆,但临时分配可能会影响应用程序的性能。
例如,如果一个程序每帧分配 1 KB 的临时内存,并且它以 60每秒帧数 在正在运行的游戏中显示连续帧的频率。更多信息
请参阅术语表,则必须每秒分配 60 KB 的临时内存。在一分钟内,垃圾回收器将有 3.6 MB 的可用内存。
每秒调用一次垃圾回收器会对性能产生负面影响。如果它必须清理分布在数千个单独分配中的 3.6 MB,则可能会导致大量垃圾回收时间。
加载作会影响性能。如果您的应用程序在繁重的资产加载作期间生成了大量临时对象,并且 Unity 在作完成之前引用了这些对象,则垃圾回收器无法释放这些临时对象。这意味着托管堆需要扩展,即使 Unity 在不久之后释放了它包含的许多对象。
若要避免托管堆扩展,请尽可能减少频繁的托管堆分配量:理想情况下为每帧 0 字节,或尽可能接近零。有关如何优化托管堆分配的信息,请参阅优化托管内存的代码。