Ostatnio pisałem zajęcia, w których odkryłem, że mogłem zmniejszyć zużycie pamięci instancji o ~ 10 bajtów/element, ale tylko kosztem uczynienia kodu znacznie bardziej złożonym. Zwiększyło to rozmiar skompilowanego pliku .class
o ~ 10 KB.Jak oszacować całkowite zużycie pamięci permgowej klasy?
Zakładam, że JVM musi załadować do pamięci plik .class
, więc te zmiany nie zapłacą same za siebie, chyba że będzie ich co najmniej 1000. Ale ta arytmetyka nie zadziała, chyba że dodatkowe 10 KB w pliku klasy jest kosztem zwiększonej złożoności kodu.
This Oracle blog sugeruje, że istnieje sporo dodatkowej pamięci uzyskiwanie spożywane przez klasę w PermGen że nie opiera się tylko na pliku .class
- na przykład, podejrzewam, że bardziej złożony kod może wymagać więcej pamięci dla optymalizacji metadanych .
Tak, to pytanie ma dwie części:
- W jaki sposób można zmierzyć rzeczywiste zużycie pamięci PermGen konkretnej klasy? Czy podczas pracy z niektórymi instrumentami lub z narzędziami do profilowania?
- Czy istnieje sposób na oszacowanie zużycia pamięci przez klasę podczas jej pisania? (Z some background knowledge można oszacować zużycie pamięci instancji klasy jako że je pisać; Zastanawiam się, czy możemy oszacować zużycie pamięci PermGen samej klasie.)
podobne dane dla Dalvik VM Byłbym doceniony, ale głównie koncentruję się na OpenJDK i innych "głównych" maszynach JVM.
Profilowanie może pomóc –
Wymagania dotyczące pamięci będą również zależeć od tego, czy HotSpot ją skompiluje. Kod JITed ma swój własny koszt. –
@JesseWilson: To prawda, ale czy istnieje dobry sposób na oszacowanie tego kosztu? Czy jest to tylko zużycie surowego zestawu, czy też jest dużo dodatkowej księgowości? –