2010-11-19 9 views
6

czy istnieje sposób sprawdzenia, czy obiekt może zostać pobrany przez garbage collectora?Sprawdź, czy obiekt może zostać pobrany przez garbage collector

Gdzieś w moim kodu mam odniesienie do obiektu:

MyObject mo = myObject; 

Następnie, za pośrednictwem Eclipse Debugger, pojawia się miejsce w pamięci obiektów. Następnie ustawić wartość null reference:

mo = null; 

Czy istnieje jakiś sposób, aby sprawdzić, czy obiekt poprzednio określany jest teraz nadaje się do zbierania śmieci lub jeśli jest gdzieś inny odniesienie do niego?

dziękuję,

Stefan

Odpowiedz

13

Nie można tego zrobić w środowisku wykonawczym z dowolnym obiektem, a w rzeczywistości nie jest to w pełni możliwe do zrobienia tego w sposób deterministyczny. Jednakże istnieją dwie opcje, które mogą być odpowiednie w zależności od potrzeb:

  1. Zrób zrzut sterty po ustawieniu odniesienie do null, a następnie załaduj go w kupie Analyzer takich jak jhat lub profilera że popiera to. Narzędzia te powinny pozwolić ci przejść przez ścieżkę od korzeni GC, a tym samym sprawdzić, czy twój obiekt jest nadal dostępny, czy nie.
  2. Zawiń obiekt w PhantomReference z podanym ReferenceQueue. Kiedy odnośnik jest zakolemkowany, wiesz, że obiekt został zebrany śmieci. (Niestety, jeśli odniesienie jest cofane, może to wynikać z faktu, że obiekt jest nadal dostępny, lub może dlatego, że GC po prostu nie sprawdził jeszcze obiektu. Podobnie jak w przypadku wszystkich pytań związanych z GC, odśmiecanie nie jest procesem deterministycznym!)

na całej choć zgadzam się, że najlepszym rozwiązaniem jest, aby mieć świadomość,kwestii wyciek pamięci i projektowania aplikacji do ich uniknąć. Jeśli masz wyciek pamięci, powinno to być wystarczająco oczywiste, a następnie możesz skoncentrować swoje energie na znalezieniu problemu (ponownie poprzez wyrzucanie i analizowanie sterty dla obiektów, które są niewłaściwie osiągalne).

Powyższe kroki są względnie czasochłonne i nie powinny być czymś, co robisz po każdej zmianie, tylko po to, by się upewnić, ale raczej są narzędziami, których możesz użyć do zbadania problemu o numerze specyficznego dla.

+0

to huuuuuuuuuuuuuge aplikacja, w której mieliśmy problemy z pamięcią. jedna optymalizacja powinna teraz doprowadzić do poprawy, ale nie tak wiele, jak się spodziewaliśmy. dlatego chcielibyśmy wiedzieć, czy konkretne przedmioty są zbierane śmieci. dzięki za odpowiedź, wypróbuję to! – swalkner

+0

Poprawnie dostaniesz czyste śmieci: D – delive

1

nr Jedyną rzeczą do zrobienia jest, aby być ostrożnym i pamiętać, że wycieki pamięci mogą występować w Javie przy pisaniu aplikacji.

Jedyne, co możesz zrobić, to użyć narzędzi do sprawdzenia, skąd pochodzą wycieki pamięci, gdy zauważyłeś taki problem. W tym celu zdecydowanie polecam Memory Analyzer.

+0

dzięki za odpowiedź! oczywiście bycie ostrożnym jest najważniejszą rzeczą, ale czasami jest to po prostu niewystarczające lub możliwe (patrz odpowiedź na andrzey doyle) – swalkner

Powiązane problemy