线程池线程执行实例成员方法时,无其他引用的实例会被GC回收吗?
线程池执行实例方法时的实例生命周期问题
实例不会被GC回收,会被线程池线程保持存活直到方法执行完毕
当你把实例成员方法传给ThreadPool.QueueUserWorkItem时,本质是创建了一个委托对象,这个委托会自动持有对该实例的强引用。只要这个委托还在线程池的工作队列中等待执行,或者正在执行(包括休眠的那一小时),这个强引用就会阻止GC回收该实例。
哪怕你释放了所有其他指向该实例的引用,线程池里的委托仍然攥着这个实例的引用。只有当实例方法完全执行完毕(休眠结束、后续逻辑跑完),委托对象本身也被回收后,实例才会失去所有强引用,这时GC才可能回收它。
不存在“GC先回收实例,线程醒来后尝试执行”的情况——GC的回收规则是只处理没有任何强引用的对象,只要线程池还在处理这个方法,实例就有有效引用,根本不会被标记为可回收。
内容的提问来源于stack exchange,提问作者ThisHandleNotInUse
相关产品推荐
相关产品推荐

