当协程的Job/Scope被垃圾回收时协程会终止吗?是否会泄漏资源?
Kotlin协程相关问题解答
示例代码
class Foo { private val scope = CoroutineScope(Dispatchers.Main.immediate + supervisorJob) init { scope.launch { // perform work } } }
问题1:当协程对应的Job或Scope被垃圾回收时,该协程是否会终止?
- 不会。协程的生命周期和它的Job/Scope的GC状态没有直接绑定。只要协程还处于执行状态(比如挂起等待操作完成、或者在持续运行逻辑),哪怕它的Job/Scope已经被垃圾回收,协程依然会继续运行,直到自身完成、被主动取消,或是因异常终止。
问题2:上述代码写法是否会造成资源泄漏?
- 会。这段代码的核心问题在于
CoroutineScope没有和Foo实例的生命周期绑定:- 当
Foo实例不再被外部引用时,scope内的协程不会自动停止,会持续占用CPU、内存,或是持有网络连接、文件句柄等资源。 - 正确的做法是给
Foo实现CoroutineScope接口,或者在Foo实例被销毁的时机(比如Android组件的onDestroy方法)主动调用scope.cancel(),取消所有关联协程。
- 当
问题3:当Foo实例及其Scope/Job被垃圾回收时,垃圾回收器是否会终止我的协程?
- 不会。垃圾回收器仅负责回收无引用对象的内存,没有能力主动终止正在运行的协程。协程的运行依赖于指定的
CoroutineDispatcher(这里是Dispatchers.Main.immediate),只要Dispatcher还在调度该协程,它就会持续执行,哪怕它的Job/Scope已经被GC回收。
内容的提问来源于stack exchange,提问作者frankelot
相关产品推荐
相关产品推荐

