Unity命令行/Jenkins构建无限触发Asset垃圾回收故障
环境信息
- Unity版本:2021.3.15f1
- 构建目标:Android
- 执行环境:Mac终端(计划用于Jenkins)
- 构建命令:
/Applications/Unity/Hub/Editor/2021.3.15f1/Unity.app/Contents/MacOS/Unity -batchmode -nographics -buildTarget Android -serial snipped -username snipped -password snipped -projectPath /Users/amit/code/myproject -executeMethod build_script_v7.PerformBuild
异常现象
编辑器UI构建完全正常,但命令行构建时会无限重复触发Asset垃圾回收请求,且日志中显示的GC阈值数值异常(达到4294967296.00 GB),核心重复日志片段如下:
Request Asset Garbage Collect because used heap size increased from 6.9 MB to 6.9 MB, exceeding the threshold of 4294967296.00 GB.
Unloading 0 Unused Serialized files (Serialized files now loaded: 0)
Unloading 0 unused Assets / (0 B). Loaded Objects now: 13357.
Memory consumption went from 6.9 MB to 6.9 MB.
Total: 8.121250 ms (FindLiveObjects: 0.295292 ms CreateObjectMapping: 0.118958 ms MarkObjects: 7.697250 ms DeleteObjects: 0.009375 ms)
解决方法
1. 构建脚本中强制禁用自动Asset GC
在你的构建脚本build_script_v7.PerformBuild开头添加代码,手动关闭自动Asset垃圾回收,避免无限触发循环:
using UnityEditor; public class build_script_v7 { public static void PerformBuild() { // 禁用自动Asset垃圾回收 EditorSettings.SetAssetGarbageCollectorEnabled(false); // 执行你的构建逻辑 BuildPlayerOptions buildOptions = new BuildPlayerOptions(); // 填充你的构建参数... BuildPipeline.BuildPlayer(buildOptions); // 构建完成后可按需重新启用(可选) EditorSettings.SetAssetGarbageCollectorEnabled(true); } }
2. 命令行强制设置GC阈值
直接在构建命令中添加参数,手动指定合理的GC阈值(比如和日志中初始正常的256MB一致),覆盖异常的阈值数值:
/Applications/Unity/Hub/Editor/2021.3.15f1/Unity.app/Contents/MacOS/Unity -batchmode -nographics -buildTarget Android -serial snipped -username snipped -password snipped -projectPath /Users/amit/code/myproject -executeMethod build_script_v7.PerformBuild -assetGCThreshold 268435456
注:268435456 是256MB对应的字节数
3. 排查构建脚本的内存操作逻辑
检查build_script_v7.PerformBuild中是否存在频繁加载/卸载资源的逻辑,或者未正确释放的对象引用——这类操作可能导致Unity的内存阈值计算异常。确保临时加载的资源在使用后通过Resources.UnloadUnusedAssets()或AssetDatabase.UnloadAsset()手动释放。
4. 清理项目缓存
删除项目目录下的Library文件夹,重新生成缓存,排除缓存损坏导致的异常:
rm -rf /Users/amit/code/myproject/Library
之后再执行原构建命令(首次构建会稍慢,因为需要重新生成缓存)。
5. 升级Unity补丁版本
2021.3.15f1属于LTS版本,但可能存在命令行构建的GC相关bug,尝试升级到同LTS分支的更高补丁版本(比如2021.3.20f1及以上),大概率能修复这类底层异常。
内容的提问来源于stack exchange,提问作者Amit

