我是一名进入Java世界的C ++程序员。而且我不能摆脱必须让Java垃圾收集器进行清理的不良感觉。
例如,此代码在Java中的行为如何?
public void myFunction() { myObject object = new myObject(); object.doSomething(); }
当myFunction()退出时,是否将删除局部变量对象?
我是否必须在退出之前将object设置为null,否则它将超出范围并被GC删除?或者,在最坏的情况下,它会像在C ++中那样泄漏吗?
不再使用后 ,将 在某个时候 将其收集 为 垃圾。我相信在Java的当前实现中,它实际上将一直保留到方法结束时,而.NET中的垃圾收集器则更具侵略性。(即使在Java中,我也不知道是否有任何保证。通常,您只 希望 在调试时将局部变量保留到其上次可能读取的范围之外。)
但是,不,您不需要将变量设置为null,否则会损害可读性。
方法退出后,对象不太可能 立即 进行垃圾回收;这取决于GC的运行时间……而且,当然,如果有任何其他保留该对象的引用,则该对象可能仍不适合进行垃圾收集。不要忘记变量的值只是一个引用,而不是对象本身。(这可能需要一段时间才能习惯于C ++。)