有理有理!嘻嘻如果以后再有人不做具体地分析就“无端地”攻击Java-GC,
你和我一起和他们吵架并力争“吵赢”,如何?哈哈哈哈哈另外我有一个问题:
[如果有一个对象的句柄a,且你把a作为某个构造器的参数,即 new Constructor ( a )的时候,即使你给a赋值为null,a也不符合垃圾收集器的收集标准。直到由上面构造器构造的新对象被赋空值时,a才可以被垃圾收集器收集。]下面是我的分析:
class X{
    Object a=new Object();
    Y y=new Y(a);
    a=null;
}
class Y{
    Y(Object o){}
}因为这时a被作为一个“方法参数”传进了另一个类Y的构造器(传址),所以在
Y的构造器Y(Object o){}结束之前,a所指向的对象不是GC-ready的(因为
还有一个句柄o指向它。但是当Y的构造器结束之后,o(一个栈变量)被自动赋为null,那么这时a所指向的对象
是否已经是GC-ready的呢?还是说(按照你的说法)即使Y的构造器结束后,a所指向的对象
依然不是GC-ready的,非要等到y被赋为null后才是GC-ready的呢?我的意思是说:“Y的构造器结束”和“y被赋为null”是2个事件,一般来说
“Y的构造器结束”要提前发生。这个问题在某些情况下是比较重要的。如果一定要等到“y被赋为null”后a才是GC-ready的,是否有可能这是
Java-GC的一个问题?或是从收集算法上看比较难以处理而不得不这样?
如果确定存在这个问题,在JVM解决这个问题之前,我们应该明确地提出来,
让大家知道,然后作为一个编程技巧来避免这个问题。另外,不同的JVM的GC性能不同,如果能确认是那个JVM存在这个问题就更好。