Pytanie o odśmiecacz

Pytanie o odśmiecacz
0

Tak mnie zastanawia ten GC...

  1. Czy jeśli mam w pamięci dwa niepotrzebne obiekty, z których jeden zawiera referencję do drugiego i vice versa (i poza tym nie ma innych odwołań), to czy one zostaną uznane za niepotrzebne przez GC? W teorii nie powinno tak być skoro GC wyłapuje tylko te obiekty, do których nie ma już referencji ale może jest jakieś coś, o czym nie wiem?
  2. Inna sprawa - wiem, że da się przekazać obiekt do odśmiecenia za pomocą metody klasy tego obiektu, ale jak to zrobić? Czy takie coś zadziała?
Kopiuj
void toGarbage(){
this = null;
} 

I czy wszystkie referencje wskazujące na ten obiekt będą automatycznie równe null?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0
  1. GC zwykle nie bazują na licznikach referencji. Podaje się tą metodę jedynie jako przykład, żeby łatwiej było zrozumieć o co chodzi.
  2. Głowy nie dam, ale to raczej nie zadziała ;]

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 3 godziny
0
  1. To co opisałeś to cykliczne referencje i raczej w każdym poważnym JVMie są obsługiwane poprawnie.
  2. W Javie nie ma ręcznego odśmiecania. Jesteśmy w restauracji i to obsługa wynosi brudne talerze :)

"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.
rafal__
+1. restauracja jest lepszym przykładem przenośni działania GC niż kibel
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:14 dni
  • Lokalizacja:Stacktrace
  • Postów:6821
1
  1. tak jak koledzy, ale... W javie 7 mamy do czynienia z nowym GC. Poza klasycznym podziałem obiektów na "generacje" i rzadszym odśmiecaniem starszych generacji wprowadzono jeden ciekawy mechanizm. Otóż pamięć jest podzielona na bloki. Obiekty alokowane są w ramach danego bloku, aż do jego wypełnienia po czym alokowany jest kolejny blok. W trakcie odśmiecania sprawdzane są referencje pomiędzy blokami. Jeżeli do danego bloku nie odnoszą się inne bloki to blok jest usuwany. Jeżeli referencji jest niewiele to sprawdzana jest możliwość przesunięcia obiektów z tego bloku do bloku trzymającego referencję. Jeżeli po tej operacji ilość referencji spada to obiekt jest przenoszony, a jeżeli rośnie to operacja nie jest przeprowadzana (obiekt nie jest przenoszony). W ten sposób wyeliminowano badanie cykli w grafie obiektów na rzecz badania cykli w grafie bloków, który z założenia jest znacznie mniejszy. Duże obiekty, które nie mieszczą się w jednym bloku są alokowane jako samodzielne i traktowane jako takie przerośnięte bloki.
  2. to się nie skompiluje, bo wartość można przypisać tylko do zmiennej, a this nie jest zmienną.

Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException

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.