Przestrzeń perm vs przestrzeń sterty

79

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?

Gareth
źródło

Odpowiedzi:

80

W kupie przechowuje wszystkie obiekty utworzone przez program Java. Zawartość sterty jest monitorowana przez moduł odśmiecania pamięci, który zwalnia pamięć ze sterty, gdy przestajesz używać obiektu (tj. Gdy nie ma już odwołań do obiektu.

W przeciwieństwie do stosu , który przechowuje typy pierwotne, takie jak ints i chars, i są zwykle zmiennymi lokalnymi i wartościami zwracanymi przez funkcję. To nie są zbierane śmieci.

Przestrzeń trwała odnosi się do specjalnej części sterty. Zobacz tę odpowiedź TAK dla wyjaśnienia: Co to jest stała przestrzeń?

Olhovsky
źródło
1
Link, który podałeś, mówi „segment stosu” - czy to naprawdę „specjalna część stosu”? Byłoby znacznie bardziej sensowne, gdyby był częścią sterty (lub nawet jakiegoś statycznego segmentu danych), a nie stosu, który po prostu nie jest odpowiedni do tego rodzaju rzeczy.
Siergiej Tachenov
1
To specjalna część hałdy.
Zredagowałem
1
jakieś zalecenia dotyczące drugiego pytania?
Gareth,
2
@Gareth: Nie należy się tym martwić. Niektóre maszyny JVM nie mają nawet dedykowanej sekcji pamięci na przestrzeń trwałą. Jeśli otrzymasz wyjątek java.lang.OutOfMemory, zwizualizuj, ile miejsca na perm jest używane za pomocą tego narzędzia: alphaworks.ibm.com/tech/pmat , a jeśli nie masz miejsca na perm (rzadko w moim doświadczeniu), możesz zwiększ rozmiar dozwolonego miejsca za pomocą opcji wiersza poleceń, -XX:MaxPermSize=256maby ustawić rozmiar dozwolonego miejsca na 256 MB.
Olhovsky
1
Dobra, widzę. Więc tak naprawdę nie ma żadnej reguły procentowej ani nic takiego. Dzięki.
Gareth
34

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.

Christopher Yang
źródło
0

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.

Pete Del Fina
źródło