Czy nieużywany obiekt jest dostępny do zbierania śmieci, gdy jest nadal widoczny na stosie?

W poniższym przykładzie istnieją dwie równoważne funkcjonalnie metody:

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;
    }
}

jednak najpierw (method1) z nich ciąg „s1” jest już wyraźnie dostępny do wyrzucania śmiecireturn komunikat. W sekundę(method2) Ciąg „s1” jest nadal osiągalny (choć z perspektywy przeglądu kodu nie jest już używany).

Moje pytanie brzmi - czy w specyfikacji jvm jest coś, co mówi, że gdy zmienna nie jest używana w dół stosu, może być dostępna do zbierania śmieci?

EDYTOWAĆ: Czasami zmienne mogą odnosić się do obiektu w pełni renderowanego obrazu i mają wpływ na pamięć.

Pytam z powodów praktycznych. Mam dużą część kodu zachłannego pamięci w jednej metodzie i myślę, czy mógłbym pomóc JVM (trochę) przez podzielenie tej metody na kilka małych.

Naprawdę wolę kod, w którym nie dokonuje się zmiany przypisania, ponieważ łatwiej jest czytać i rozumować.

AKTUALIZACJA: zajls-12.6.1:

Kompilator Java lub generator kodu może ustawić zmienną lub parametr, który nie będzie już używany, na wartość null, aby spowodować, że pamięć dla takiego obiektu będzie potencjalnie możliwa do odzyskania wcześniej.

Wygląda więc na to, że GC może zażądać obiektu, który nadal jest widoczny. Wątpię jednak, aby ta optymalizacja odbywała się podczas kompilacji offline (to zepsułoby debugowanie) i najprawdopodobniej zostanie wykonana przez JIT.

questionAnswers(5)

yourAnswerToTheQuestion