11

Oto mój przypadek użycia. Próbujemy zawęzić potencjalny wyciek pamięci w aplikacji i używamy narzędzia do analizy pamięci, aby zrobić migawkę sterty, abyśmy mogli szukać instancji obiektu i odniesień. (Jeśli to pomoże, używamy YourKit.)Czy istnieje sposób na wymuszenie słabych i/lub miękkich obiektów odwoływanych, aby uzyskać GC w języku Java?

Ta aplikacja korzysta w szerokim zakresie z proxy dynamicznego i CGLIB, co kończy się przechowywaniem ton odniesień do klas i modułów ładujących klasy w WeakHashMaps.

Po uruchomieniu naszego testu oczekujemy, że wszystkie twarde odwołania do obiektu X i jego modułu ładującego znikną, ale ponieważ w teście było wiele serwerów proxy, w końcu mamy do dyspozycji wiele słabych/miękkich odniesień. . (Mogę tylko znaleźć referencje WeakHashMap, ale YourKit zawija zarówno słabe, jak i miękkie odniesienia do jednego elementu w podsumowaniu, więc nie mogę być pewny, że nie brakuje mi gdzieś miękkiego odniesienia.)

Dzieje się tak nawet po żądanie pełnego GC z JVM. (Korzystając z systemu Sun JDK 1.6.0_23 w trybie serwera.)

To wydaje jakby przyznaje JVM są tylko słabe/miękkie odniesienia do tych obiektów, ale nie mogę się zmusić go do GC te rzeczy być w 100% pewne. (Tak, to, co chcę jest do tego, aby zniknąć całkowicie z hałdy i jej wykorzystanie ClassLoader z PermGen aby odejść.)

Każdy wie, jak go skonfigurować i/lub wymusić JVM do dysponowania obiektami tylko miękkich/słabo odniesione?

+0

Czy zarejestrowałeś swoje obiekty na globalne wydarzenia? Być może statyczne pole (lub inny obiekt wątku lub coś innego) ma do nich odniesienie ... – Mehrdad

+0

Dobre pytanie - już się nad tym zastanawiałem, a YourKit dostarcza wystarczających informacji, aby szybko znaleźć tego typu rzeczy. Podczas gdy wciąż badam, do tej pory zawęziłem to (jak sądzę) do pewnych zachowań zainicjowanych przez Spring AOP, gdy proksuje klasy/metody używając RegexpMethodPointcutAdvisor. JEDNAK, jest to tylko jeden specjalny przypadek (jak dotąd) tego doradcy - używamy go w wielu miejscach, które NIE wydają się stwarzać tego problemu. Nadal pracuję nad zidentyfikowaniem tego, co jest wyjątkowe w jednym przypadku, który ... spowoduje, że wrócę, gdy będę miał więcej. – Scott

+0

OK, więc oto aktualizacja. Sądzę, że znalazłem papieros do mojego konkretnego problemu. Jeden z serwerów proxy użyty w naszej aplikacji leniwie ładuje swoją implementację w razie potrzeby z pamięci podręcznej, aby zapewnić, że operacja zawsze odbywa się na ostatnio buforowanym obiekcie. Jeśli pamięć podręczna nie ma obiektu, pamięć podręczna została skonfigurowana do tworzenia instancji i inicjowania obiektu. Proxy to raczej głupie proxy, które w przypadku wywołania metody prosi cache o obiekt, a następnie wywołuje metodę na obiekcie. Komentarze mają limit znaków, więc czytaj dalej ... – Scott

Odpowiedz

10

Wywołanie GC powinno zawsze zwalniać wszystkie słabo dostępne obiekty (zakładając, że "żądanie" wywołane przez wywołanie System.gc zostało faktycznie przyznane). Jeśli słabe referencje nie zostaną usunięte przez GC, oznacza to, że obiekty są co najmniej delikatnie osiągalne.

Usuwanie miękkich odniesień jest trudniejsze, ponieważ zależy to od uznania JVM. Jedynym sposobem na zagwarantowanie usunięcia cicho dostępnych obiektów jest spowodowanie wyrzucenia. Ta sztuczka została zademonstrowana w this discussion.

+1

Czy 'System.gc' nie jest tylko podpowiedzią?I dlatego nie jest odpowiedzią na pytanie "nie"? – nmr

+1

Zastanawiam się, czy to działa na Dalvik/ART – nmr

Powiązane problemy