Java Strong vs Weak reference

Java Strong vs Weak reference
anckor
  • Rejestracja:prawie 6 lat
  • Ostatnio:6 dni
  • Postów:309
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?

edytowany 3x, ostatnio: anckor
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
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ół.


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
edytowany 1x, ostatnio: scibi92
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Silesia/Marki
  • Postów:5505
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


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:5 minut
7

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

Kopiuj
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:

Kopiuj
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.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 2x, ostatnio: Wibowit

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.