W większości przypadków w aplikacjach korporacyjnych podana sterta Java jest większa niż idealny rozmiar, wynoszący maksymalnie 12 do 16 GB. Trudno mi było sprawić, by profiler NetBeans działał bezpośrednio w tych dużych aplikacjach Java.
Ale zwykle nie jest to potrzebne. Możesz użyć narzędzia jmap, które jest dostarczane z jdk, aby wykonać "na żywo" zrzut sterty, czyli jmap zrzuci stertę po uruchomieniu GC. Wykonaj jakąś operację na aplikacji, poczekaj, aż operacja zostanie zakończona, a następnie wykonaj kolejny zrzut sterty „na żywo”. Użyj narzędzi takich jak Eclipse MAT, aby załadować zrzuty sterty, posortować na histogramie, zobaczyć, które obiekty wzrosły lub które są najwyższe, to dałoby wskazówkę.
su proceeuser
/bin/jmap -dump:live,format=b,file=/tmp/2930javaheap.hrpof 2930(pid of process)
Jest tylko jeden problem z tym podejściem; Ogromne zrzuty sterty, nawet z opcją na żywo, mogą być zbyt duże, aby można je było przenieść na okrążenie programistyczne i mogą wymagać maszyny z wystarczającą ilością pamięci / RAM do otwarcia.
W tym miejscu pojawia się histogram klas. Możesz zrzucić na żywo histogram klas za pomocą narzędzia jmap. Daje to tylko histogram klasy wykorzystania pamięci, ale w zasadzie nie będzie zawierał informacji do łańcucha referencji. Na przykład może umieścić tablicę char na górze. A gdzieś poniżej klasa String. Musisz sam narysować połączenie.
jdk/jdk1.6.0_38/bin/jmap -histo:live 60030 > /tmp/60030istolive1330.txt
Zamiast pobierać dwa zrzuty sterty, weź dwa histogramy klas, jak opisano powyżej; Następnie porównaj histogramy klas i zobacz klasy, które rosną. Sprawdź, czy możesz powiązać klasy Java z klasami aplikacji. To da całkiem niezłą wskazówkę. Oto skrypt w Pythonie, który pomoże ci porównać dwa zrzuty histogramu jmap. histogramparser.py
Wreszcie narzędzia, takie jak JConolse i VisualVm, są niezbędne, aby zobaczyć wzrost pamięci w czasie i sprawdzić, czy występuje przeciek pamięci. Wreszcie czasami problemem może nie być wyciek pamięci, ale wysokie zużycie pamięci. W tym celu włącz rejestrowanie GC; użyj bardziej zaawansowanego i nowego GC kompaktowania, takiego jak G1GC; i możesz użyć narzędzi jdk, takich jak jstat, aby zobaczyć zachowanie GC na żywo
jstat -gccause pid <optional time interval>
Inne odniesienia do Google dla -jhat, jmap, Full GC, ogromna alokacja, G1GC