面试题
Unity的垃圾回收是在主线程中运行的吗?
回答
首先,Unity并不负责垃圾回收,Unity的脚本基于mono,而mono基于.NET(mono和.net的关系还没理清)。
在.NET 4.0之前,CIL使用并发垃圾回收技术来清理不再使用的对象。当对第0代或第1代(这两代称为暂时代)对象执行回收的时候,系统会暂时挂起所有活动的线程,确保应用程序在回收过程中不会访问托管堆。不在暂时代的对象,并发垃圾回收会有单独的线程去回收,并且允许在回收非暂时代的时候继续分配堆上的对象。
在.NET4.0之后,对暂时代的对象执行回收的时候,不再挂起其他线程,而是用额外的后台执行线程去负责回收。
疑问
用额外的后台执行线程去负责回收的时候,要是新分配了对象到托管堆上,后台线程该如何处理?怎么分辨?
参考
《精通C# 第六版 13.5,13.6章节》