软引用与强引用相互引用是否会引发死锁?置销售记录列表为null后YGC能否清理?
问题解答
一、产品销售记录列表置为null后,YGC能否清理相关对象?
能不能回收这些对象,核心看它们是否还被外部强引用持有:
- 如果把列表置为null后,没有其他强引用(比如汇总函数的局部变量、全局缓存、静态变量等)指向这些产品或订单对象,哪怕产品和订单之间有强引用关联,或者某个对象内部有软引用指向自身(this),GC都能识别出这些对象是不可达的,YGC(如果这些对象在新生代)就会把它们清理掉——GC判断回收的依据是对象是否有可达的强引用链,内部循环引用(不管是强还是软)都不影响。
- 但如果还有其他强引用拿着这些对象(比如汇总函数还在执行,或者某个地方缓存了这些对象),那YGC肯定清不掉,得等这些强引用释放后才行。
另外要注意:软引用本身不会阻止GC回收,只有当内存充足时软引用对象才会被保留,内存不足时会被回收,但这里的关键还是外部强引用是否存在。
二、软引用与强引用相互引用会不会引发死锁?
完全不会。
死锁是多线程场景下,线程互相持有对方需要的锁,导致彼此都无法继续执行的问题,和GC的引用类型没有任何关系。软引用和强引用只是GC用来判断对象是否该回收的标记逻辑,和线程同步、锁机制完全不搭边。哪怕对象之间存在强+软的循环引用,最多就是影响GC回收(但只要外部无强引用,GC依然能处理),绝对不会引发死锁。
内容的提问来源于stack exchange,提问作者ComaGear
相关产品推荐
相关产品推荐

