Nie ma prostego sposobu, aby to zrobić, jednak ostatnio analizowałem wydajność pamięci dużych aplikacji java i mogę podzielić się doświadczeniem.
Oto jak znalazłam jakie obiekty są promowane do starej gen:
Najpierw trzeba określić, jakie obiekty znajdują się w „starym”/zwyczajnych przestrzeni. Jest to w zasadzie standardowa analiza sterty java. Do tego polecam jmap. Jest częścią słońca jvm. Uruchom: jmap -dump:file=heap.hprof PID
, aby uzyskać zrzut sterty. Będzie to wstrzymać JVM podczas zrzutu (~ do 30 sekund na kupie 2GB)
Teraz załadować plik .prof w Memory analyser (najlepszym narzędziem do tego, ręce w dół) chciałbym spędzić dzień gra z pamięci analizatora aby to zrozumieć, obejrzyj screencam (wymaga zalogowania, ale warto).
Teraz dowiesz się, jakie przedmioty znajdują się w twoim stercie.
Oto podstęp: na ekranie przeglądu analizatora pamięci znajduje się link do: "Histogram obiektów nieosiągalnych". Teraz te obiekty mają zostać zebrane podczas następnego GC. Ale niektórzy są prawdopodobnie w Eden, niektórzy w ocalałych i niektórzy w starszym wieku.
Teraz wybierz profilera z funkcją profilowania pamięci, wolę TwójKit. Uruchamianie aplikacji przy użyciu pakietu i rejestrowanie przydzielania obiektów.
Uruchom i zarejestruj tworzenie obiektu. Po utworzeniu listy obiektów użyj wszystkich trzech list, aby uzyskać obraz tego, co się dzieje. Rób to, co ludzie robią najlepiej, patrz wzorce.
- Jakie obiekty są tworzone i są osiągalne. (Analizator Memory)
- Przedmioty nieosiągalny w stercie (analizatora Memory)
- Obiekty utworzone podczas biegu (Profiler)
Innym sposobem podejścia jest YourKit generations view. Możesz zrobić migawki sterty i porównać, które obiekty są wciąż żywe między migawkami. Jeśli użyjesz tego z visualgc, możesz określić, jak długo obiekt musi być żywy, aby awansować na stary gen, i robić migawki w tych odstępach czasowych, aby zobaczyć, które obiekty jeszcze żyją.
Cóż, powodzenia. /JT