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?
void toGarbage(){
this = null;
} 

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

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 ;]
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 :)
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ą.

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