2013-05-31 14 views
7

To, o co pytam, może być głupim pytaniem, więc proszę, wybaczcie mi to. Więc to idzie tak:Czy ten obiekt java kwalifikuje się do zbierania śmieci na liście

List<Boss> bossList = new ArrayList<Boss>(); 
Boss b = null; 
for(Employee e : List<Employee> myList){ 
    b = new Boss(); 
    b.setEmployee(e); 
    bossList.add(b); 
    b = null; 
} 

Tak więc w powyższym scenariuszu tworzę wiele obiektów Boss, a następnie de-przedstawieniu ich (wiem, że nie trzeba pisać „b = null”, ale zrobiłem to dla jasności mojego pytania). W normalnym scenariuszu oznaczałbym je do usuwania śmieci, robiąc to, ale ponieważ w tym scenariuszu dodaję te obiekty Bossa do kolekcji List, czy są one oznaczone jako GC, czy nie? Jeśli nie, to dlaczego? W jaki sposób kolekcja List działa wewnętrznie w celu przechowywania referencji dla każdego dodawanego obiektu, aby uniknąć zbierania śmieci?

[EDIT] 

Zakres pytanie ogranicza się tylko do poszczególnych obiektów Boss utworzonych w for pętli, biorąc pod uwagę, że metoda ta zwraca referencję Listy do świata zewnętrznego.

+0

Sam obiekt, który umieściłeś na liście, jest oczywiście niedostępny dla GC, ponieważ odniesienie do niego nadal istnieje, nawet jeśli anulujesz 'b'. – NilsH

+0

Obiekt nie może być zbędny, jeśli istnieje jakiś sposób w bieżącym stanie programu, aby został osiągnięty (z wyjątkiem specjalnej klasy WeakReference i powiązanych z nią klas). Wystarczy jedno odniesienie, bez względu na to gdzie, z aktywnego kodu. – Patashu

Odpowiedz

5

ArrayList ma wewnętrznie Object[] elementData. Po dodaniu b do bossList ArrayList przypisano elementData[0] = b. Tak więc po przypisaniu null do b instancja Boss nadal jest przywoływana z elementData[0] i nie może być GCed. Ale ponieważ instancja ArrayList odwołuje się tylko do zmiennej metody po tym, jak metoda zwróci zarówno instancje ArrayList, jak i Boss, instancje będą kwalifikowały się do GC.

9

Obiekty Boss nie zostaną zebrane przez , ponieważ są nadal przywoływane w bloku kodu, który został opublikowany. bossList to ArrayList, który ma wewnętrzną tablicę o numerze Object, dzięki czemu zawiera odniesienia do tych obiektów, które są do niej dodawane.

W takiej sytuacji rozpatrywane są nie tylko referencje, ale wszystkie refernecy we wszystkich przedmiotach.

EDIT: Ponieważ wracają wykaz w kodzie obiekty nie zostaną oznaczone za zbieranie śmieci, dopóki lista nie jest wymieniony w programie.

+0

Ale ponieważ w metodzie jest zadeklarowana 'List ', to po zakończeniu tej metody lista zostanie oznaczona jako GC, w ten sposób zostaną również oznaczone odwołania do obiektów 'Boss'. –

+0

Prawidłowo. Jak tylko blok, w którym zostanie zadeklarowana 'TablicaList', zakończy się, wszystkie obiekty zostaną zebrane (jeśli nie będą się dalej odwoływać). –

+0

Oczywiście, jeśli zakładasz, że lista istnieje tylko w ramach metody. – NilsH

3

Oto, co naprawdę dzieje się z kodem:

Hello

-1

Ponieważ Java jest podanie przez odniesienie, kiedy tylko dodać b do bossList, bossList rozpoczyna odwołuje się do lokalizacji pamięci, który jest b wskazując. Tak więc, gdy b unieważnił tylko odnośnik z b do referencji, jest zepsuty. W ten sposób utrzymanie obiektu dostępne poprzez bossList.