当未使用的对象在堆栈中仍然可见时,它是否可用于垃圾回收?
在下面的示例中,有两种功能等效的方法:
public class Question {
public static String method1() {
String s = new String("s1");
// some operations on s1
s = new String("s2");
return s;
}
public static String method2() {
final String s1 = new String("s1");
// some operations on s1
final String s2 = new String("s2");
return s2;
}
}
然而,在它们的first()中,字符串“s1”显然可用于语句之前的垃圾回收。在第二()字符串中,“s1”仍然是可访问的(尽管从代码审查的角度来看,它不再使用)。method1
return
method2
我的问题是 - jvm规范中是否有任何内容表明,一旦变量在堆栈中未使用,它就可用于垃圾回收?
编辑:有时,变量可以引用对象,如完全渲染的图像,并对内存产生影响。
我问这个问题是出于实际考虑。我在一个方法中有大量内存贪婪的代码,并思考我是否可以通过将此方法拆分为几个小方法来帮助JVM(一点)。
我真的更喜欢不进行重新分配的代码,因为它更容易阅读和推理。
更新:根据 jls-12.6.1:
Java 编译器或代码生成器可以选择将不再使用的变量或参数设置为 null,以使此类对象的存储可能更快地回收
因此,GC似乎有可能声明仍然可见的对象。然而,我怀疑这种优化是在离线编译期间完成的(它会搞砸调试),并且很可能由JIT完成。