当执行到第16行时,下述代码中有多少对象可被垃圾回收?
Java垃圾回收对象数量分析
先贴出待分析的代码:
class Beta{ } class Alpha { static Beta b1; Beta b2; } public class Tester { public static void main(String[] args) { Beta b1 = new Beta(); Beta b2 = new Beta(); Alpha a1 = new Alpha(); Alpha a2 = new Alpha(); a1.b1 = b1; a1.b2 = b1; a2.b2 = b2; a1 = null; b1 = null; b2 = null; // do stuff } }
对象创建统计
代码一共创建了4个对象:
- 2个
Beta实例(下文简称Beta1、Beta2) - 2个
Alpha实例(下文简称Alpha1、Alpha2)
第16行时的引用情况分析
执行完第15行的赋值操作后,各对象的引用状态如下:
- Alpha1:原局部变量
a1被置为null,没有其他任何引用指向该对象,满足垃圾回收条件。 - Alpha2:局部变量
a2仍指向该对象,存在有效引用,不会被回收。 - Beta1:虽然局部变量
b1被置为null,但Alpha类的静态变量b1仍持有它的引用(注意a1.b1是类静态成员,操作的是Alpha类的变量而非a1实例的变量),因此存在有效引用,无法被回收。 - Beta2:虽然局部变量
b2被置为null,但Alpha2的实例变量b2仍指向它,而Alpha2本身有有效引用,因此Beta2也无法被回收。
结论
符合垃圾回收条件的对象只有1个,即Alpha1。你认为有2个可回收对象的误区,大概率是忽略了Alpha类的静态变量仍在引用Beta1这一点。
内容的提问来源于stack exchange,提问作者Kartik Sinha
相关产品推荐
相关产品推荐

