Po pierwsze, jaka jest różnica między przestrzenią trwałą a przestrzenią sterty (co i w jaki sposób maszyna JVM decyduje się na użycie każdej przestrzeni pamięci)?
Po drugie, ale najważniejsze, jaki rodzaj współczynnika byłby zalecany dla standardowej aplikacji Java typu MVC?
źródło
-XX:MaxPermSize=256m
aby ustawić rozmiar dozwolonego miejsca na 256 MB.Osobiście nie uważałbym PermGen za specjalną część kupy.
Wolałbym myśleć o sterty jako o obszarze pamięci przeznaczonym do przechowywania instancji obiektów, podczas gdy PermGen jako o obszarze przeznaczonym do przechowywania definicji klas. W rezultacie cykl życia sterty jest powiązany z aplikacją, podczas gdy cykl życia PermGen jest powiązany z maszyną JVM.
Jednym z najlepszych przykładów tego, dlaczego aplikacja i jej JVM mogą mieć inny cykl życia, jest kontener Java EE. Na serwerze aplikacji można wdrażać i cofać wdrażanie aplikacji bez ponownego uruchamiania serwera. Podczas cofania wdrożenia (lub ponownego wdrożenia) łatwo jest zwolnić wszystkie instancje obiektów, tj. Przestrzeń sterty, ale raczej trudne jest wyczyszczenie wszystkich klas załadowanych przez tę aplikację z PermGen, ponieważ niektóre z klas mogą nadal być przywoływane przez JVM.
Jednym z takich przypadków są nieszczelne sterowniki . Podczas wdrażania aplikacji sterownik JDBC jest ładowany i rejestrowany w DriverManager. Gdy ta aplikacja nie jest wdrożona, DriverManager działa i przechowuje odniesienie do sterownika, jego oryginalnego programu ładującego klasy i wszystkiego, co ładuje ten program ładujący klasy. W rezultacie powstaje wyciek pamięci w PermGen, ale nie jest to wina zarządzania pamięcią aplikacji.
To prawda, że maszyny JVM, takie jak JRocket, w ogóle nie mają PermGen, wszystko jest przechowywane w stosie. Tylko w takim kontekście możesz nazwać PermGen „specjalną częścią” sterty. Nawet wtedy powinniśmy nadal patrzeć na PermGen i stertę inaczej, ponieważ mają one bardzo różne przeznaczenie i mają bardzo różne typy wycieków pamięci.
Aktualizacja : W Oracle JDK 8 PermGen został zastąpiony przez "Metaspace" i jest teraz oficjalnie częścią kupy. Nie będziemy już musieli specjalnie dostrajać PermGen.
źródło
NIE możesz nadawać nazw przydzielonej pamięci w stercie.
Oznacza to, że int
x
(jego nazwa) jest przydzielone na stosie. Możesz dotrzeć do wskaźnika po jego nazwie, więc wskaźnik znajduje się na stosie. Nie możesz dotrzeć do obiektu po jego nazwie, ponieważ nie ma on nazwy. Dostęp do (bezimiennego) obiektu musi być prowadzony przez jego wskaźnik.źródło