You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

当协程的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:01:06