Java 月球着陆器中的Android垃圾收集
在月球着陆器示例(由谷歌的Android站点提供)中,在一个名为“run()”的方法中有一个主循环。以下是:Java 月球着陆器中的Android垃圾收集,java,android,Java,Android,在月球着陆器示例(由谷歌的Android站点提供)中,在一个名为“run()”的方法中有一个主循环。以下是: @Override public void run() { while (mRun) { Canvas c = null; try { c = mSurfaceHolder.lockCanvas(null);
@Override
public void run() {
while (mRun) {
Canvas c = null;
try {
c = mSurfaceHolder.lockCanvas(null);
synchronized (mSurfaceHolder) {
if (mMode == STATE_RUNNING) updatePhysics();
doDraw(c);
}
} finally {
// do this in a finally so that if an exception is thrown
// during the above, we don't leave the Surface in an
// inconsistent state
if (c != null) {
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
所以现在,我的问题是:每次循环都保持c为空,从而导致更多的垃圾收集,这不是很糟糕吗?也许我不太明白这一点,但为什么它必须为null?这一点也不错,它确保了画布对象在重新创建时具有0或null引用。这是很好的编程实践 还要注意finally语句,它确保如果存在有效的Canvas对象,那么它将被清除。如果它为null,那么将其重置为null没有任何缺点。不需要处罚或额外清理。记住一个对象有一个地址,对null的引用确保它不指向可能潜伏在周围(尚未清理)的某个有效对象
此外,当您将变量初始化为null时,不会调用垃圾收集器。它只是意味着对象不引用当前内存中的任何内容。最初将c赋值为null不会导致垃圾收集器运行。C没有指向对象,因此没有要收集的内容。你要做的就是确保它不指向任何东西。此外,c指向的canvas对象可能还有其他引用,这意味着仅仅因为c不再指向它,并不一定意味着它已经准备好被收集。如果您指的是行
canvas c=null代码>-它与GC完全无关。这是本地画布引用c
的初始化,因此代码可以编译。在循环中重新创建对象不会导致垃圾收集吗?@Eugene-如果您正在实例化对象并为其分配内存,那么是的。您将强制定期进行垃圾回收以释放该内存。android网站在你的应用程序中称这些为“打嗝”。但是给一个对象分配一个空值不是一回事。好吧,我想我从每个人的回答中都明白了。谢谢你的帮助!什么是0引用(在Java上下文中)?Steve抱歉,0不是一个好例子,我的观点是试图解释null,好像它是一个整数类型一样。如果这可能是使用整数计算总数,则可以将总数重置为0。