2008-09-28 9 views
15

Udało mi się uzyskać "wyciek" pamięci w aplikacji Java, którą rozwijam. Podczas uruchamiania mojego zestawu testów JUnit losowo wydostaję się z wyjątków pamięci (java.lang.OutOfMemoryError).Jak mogę zobaczyć, co jest w mojej stercie w Javie?

Jakie narzędzia można użyć do zbadania sterty mojej aplikacji java, aby zobaczyć, co zużywa całą moją stertę, aby móc ustalić, co zawiera odniesienia do obiektów, które powinny być w stanie zebrać śmieci.

Odpowiedz

23

VisualVM jest zawarty w najnowszych wydaniach oprogramowania Java. Możesz użyć tego do utworzenia zrzutu sterty i spojrzeć na znajdujące się w nim obiekty.

Alternatywnie, można również stworzyć commandine heapdump korzystając jmap (w JDK/bin dir):

jmap -dump:format=b,file=heap.bin <pid> 

Można nawet użyć tego, aby uzyskać szybki histogram wszystkich obiektów

jmap -histo <pid> 

Mogę polecić Eclipse Memory Analyzer (http://eclipse.org/mat) do zaawansowanej analizy zrzutów sterty. Pozwala dowiedzieć się, dlaczego dany obiekt lub zestaw obiektów jest żywy. Oto wpis na blogu, na którym można sprawdzić, co potrafi narzędzie Memory Analyzer: http://dev.eclipse.org/blogs/memoryanalyzer/2008/05/27/automated-heap-dump-analysis-finding-memory-leaks-with-one-click/

+0

Visual VM i Netbeans Profiler umożliwiają wykonywanie tych samych czynności co EMA. –

+1

Nie wiem o netbeans, ale z pewnością nie znalazłem "najkrótszej ścieżki do gc root" w visual vm. – Tom

+1

+1 dla EMA - ratownik. –

0

Jeśli używasz systemu obsługującego GTK, możesz spróbować użyć opcji JMP.

6

Jeśli trzeba coś za darmo, spróbuj VisualVM

Z opisu projektu :

VisualVM to wizualne narzędzie integrujące narzędzia JDK z linii poleceń i lekkie funkcje profilowania. Zaprojektowany z myślą zarówno o czasie rozwoju, jak io czasie produkcji.

0

Możesz wypróbować detektor wycieków pamięci, który jest częścią pakietu narzędzi JRockit Mission Control. Pozwala na sprawdzenie sterty podczas działania JVM. Nie musisz ciągle robić migawek. Możesz po prostu połączyć się online z maszyną JVM, a następnie zobaczyć, jak zmienia się stertę między zbiorami śmieci. Można również sprawdzać obiekty, śledzić odwołania w formie graficznej i pobierać stosy z miejsca, w którym aplikacja aktualnie przydziela obiekty. Oto krótki introduction.

Narzędzie można bezpłatnie wykorzystać do programowania i można je pobrać pod numer here.

1

Użyj Eclipse Memory Analyzer

Nie ma innego narzędzia, które jestem świadomy jakiegokolwiek narzędzia zbliżony do jego funkcjonalność i wydajność oraz cena (za darmo i open source) Analizując wysypisk sterty.

2

To dość stare pytanie. Wiele osób mogło zacząć używać IntelliJ, ponieważ wcześniej otrzymała odpowiedź. IntelliJ ma wtyczkę, która może pokazać użycie pamięci o nazwie JVM Debugger Memory View.

+0

Po trochę zabawy z różnymi narzędziami, stwierdziłem, że IntelliJ ma również [wtyczkę do VisualVM] (https://plugins.jetbrains.com/plugin/7115-visualvm-launcher) (wymienioną w innej odpowiedzi). Ta kombinacja okazała się najlepsza dla mnie. – mkasberg