В следующем примере есть два функционально эквивалентных метода:
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;
}
}
однако в первом (method1
) из них строка "s1" явно доступна для сбора мусора перед оператором return
. Во второй (method2
) строка "s1" по-прежнему доступна (хотя из обзора кода предполагается, что она больше не используется).
Мой вопрос: есть ли что-нибудь в jvm spec, которое говорит, что если переменная не используется в стеке, она может быть доступна для сбора мусора?
EDIT: Иногда переменные могут ссылаться на объект как полностью отображаемое изображение и влияют на память.
Я спрашиваю из-за практических соображений. У меня есть большой кусок памяти-жадного кода в одном методе и думаю, что если я смогу помочь JVM (немного), просто разделив этот метод на несколько небольших.
Мне действительно нравится код, где не выполняется переназначение, так как его легче читать и рассуждать.
ОБНОВЛЕНИЕ: за jls-12.6.1:
Java-компилятор или генератор кода могут выбрать установку переменной или параметра, который больше не будет использоваться для нулевого значения, чтобы скорее сократить потенциальную возможность хранения такого объекта раньше
Итак, похоже, что GC может претендовать на объект, который все еще отображается. Я сомневаюсь, однако, что эта оптимизация выполняется во время автономной компиляции (это приведет к отладке отладки), и, скорее всего, это будет сделано JIT.