现在是时候质疑JAVA System.GC()和System.runFinalizer了。
public interface SomeAction {
public void doAction();
}
public class SomePublisher {
private List<SomeAction> actions = new ArrayList<SomeAction>();
public void subscribe(SomeSubscriber subscriber) {
actions.add(subscriber.getAction());
}
}
public class SomeSubscriber {
public static int Count;
public SomeSubscriber(SomePublisher publisher) {
publisher.subscribe(this);
}
public SomeAction getAction() {
final SomeSubscriber me = this;
class Action implements SomeAction {
@Override
public void doAction() {
me.doSomething();
}
}
return new Action();
}
@Override
protected void finalize() throws Throwable {
SomeSubscriber.Count++;
}
private void doSomething() {
// TODO: something
}
}
现在我正在尝试在主代码块中强制进行垃圾回收和终结器。
SomePublisher publisher = new SomePublisher();
for (int i = 0; i < 10; i++) {
SomeSubscriber subscriber = new SomeSubscriber(publisher);
subscriber = null;
}
System.gc();
System.runFinalization();
System.out. println("The answer is: " + SomeSubscriber.Count);
由于JAVA GC调用并不保证被调用(正如javadoc所解释的和Java中finalize()方法何时被调用?所解释的),我最初的想法是它会输出随机SomeSubscriber.Count。(至少通过System.GC和finalizer强制输出1。)
然而,它总是为0。
有人能解释一下这种行为吗?
(此外,静态成员字段是否独立于类实例存在,并且在代码执行期间永远不会被销毁?)
System.gc()
。在最好的情况下,它将什么也不会做,在最坏的情况下,它将始终导致全停顿垃圾回收(例如,当使用CMS收集器时)。 - Mick Mnemonic