在以下示例中,有两种功能等效的方法:
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( method1
) 中,字符串“s1”显然可用于return
声明前的垃圾收集。在 second( method2
) 中,字符串“s1”仍然可以访问(尽管从代码审查的角度来看,它不再使用了)。
我的问题是 - jvm 规范中是否有任何内容表明一旦变量在堆栈中未使用,它就可以用于垃圾收集?
编辑: 有时变量可以引用像完全渲染的图像这样的对象并且对内存有影响。
我问是出于实际考虑。我在一种方法中有大量内存贪婪的代码,我想我是否可以通过将这种方法分成几个小的方法来帮助 JVM(一点)。
我真的更喜欢没有重新分配的代码,因为它更容易阅读和推理。
更新:根据jls-12.6.1:
Java 编译器或代码生成器可能会选择将不再用于 null 的变量或参数设置为导致此类对象的存储可能更快地被回收
所以看起来 GC 有可能声明仍然可见的对象。但是我怀疑这种优化是在离线编译期间完成的(它会搞砸调试)并且很可能会由 JIT 完成。