Java Strong vs Weak reference

0

Na tym forum takiego wątku jeszcze nie znalazłem. Ogólnie definicje obu reference znam, sporo poczytałem w Google, ale wg mnie słownikowe definicje nikogo niczego nie nauczą, a nikt nie podaje przykładów. Czy bean springowy wstrzyknięty przez DI jest strong reference, bo nigdy nie zostanie usunięty przez GC? A na przykład obiekt userDto przekazany jako parametr takiej meotdy:

private void logInfo(UserDto userDto) {
    log.info("User has logged {}", userDto.getName());
}

to już weak reference?

3

Weak reference to typ :
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ref/WeakReference.html
Zarówno UserDto i bean Springowy to strong reference. I każda referencja może pójść ostatecznie pod GC, tyle że na przykład jakiś @Service nie trafi bo będzie raczej używany przez cały czas życia aplikacji, a UserDto żyje przez czas życia requestu na ogół.

3

Trochę źle rozumiesz te definicje w Javie. Żeby w Javie można było mówić o Weak References to wprost musi być użyta klasa WeakReference

7

Zwykłe zmienne zawierające referencje są zawsze strong:

Object referencja = new CośTam();
assert(referencja != null); // zawsze OK
Thread.sleep(dowolnyCzas);
assert(referencja != null); // zawsze OK

WeakReference nie są strong, bo mogą "zniknąć" ze środka:

WeakReference referencja = new WeakReference(new CośTam());
assert(referencja.get() != null); // prawie zawsze OK, trzeba mieć dużego pecha, żeby GC usunął referencję już przed tym wywołaniem
Thread.sleep(ileśTamCzasu);
assert(referencja.get() != null); // jeśli naśmiecimy i odpali się GC w międzyczasie to tutaj asercja nam rzuci błąd, bo słaba referencja została wyczyszczona przez GC

Jeżeli do obiektu prowadzą referencje o różnej sile to o jego usunięciu (i późniejszym wyczyszczeniu referencji) decyduje siła najsilniejszej referencji. Stąd jeśli masz WeakReference do jakiegoś obiektu, a w innym miejscu przez cały czas jest silna referencja to obiekt nie zostanie usunięty, a WeakReference nie zostanie wyczyszczona.

Osobną kwestią jest to czy Spring używa WeakReference gdzieś tam w swoich fabrykach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1