局部变量上的垃圾收集

Esp*_*pen 17 java garbage-collection

我是一名进入Java世界的C++程序员.我无法摆脱不得不让Java垃圾收集器进行清理的坏感觉.

例如,这段代码将如何在Java中运行?

public void myFunction() {
    myObject object = new myObject();
    object.doSomething();
}
Run Code Online (Sandbox Code Playgroud)

当myFunction()退出时,是否会删除局部变量对象?

在退出之前是否必须将对象设置为null,或者它是否超出范围并被GC删除?或者,在最坏的情况下,它会像在C++中那样泄漏吗?

Jon*_*eet 28

它将在不再使用后的某个时刻被垃圾收集.我相信Java的当前实现它实际上会持续到方法结束,而.NET中的垃圾收集器更具侵略性.(我不知道即使在Java中是否有任何保证.通常,您只希望本地变量在调试时保持超出其最后可能的读数.)

但不,您不需要将变量设置为null,这样做会损害可读性.

方法退出后,对象不太可能立即收集垃圾; 这取决于GC运行的时间......当然,如果其他任何东西保留在对象的引用上,它可能无法进行垃圾收集.不要忘记变量的值只是一个引用,而不是对象本身.(这可能需要一段时间才能习惯来自C++.)

  • @Erick:我更想避免保证*future*实现会将局部变量保持为"root"..NET CLR肯定没有,实际上一个对象可以被垃圾收集*而实例方法仍然在"in"中执行*只要GC知道什么都不会引用它的任何字段. (2认同)