statyczna alokacja w Javie-generowanie sterty, stosu i permanent

Ostatnio dużo czytam o schematach alokacji pamięci w Javie i było wiele wątpliwości, ponieważ czytam z różnych źródeł. Zebrałem już swoje koncepcje i prosiłbym o przejrzenie wszystkich punktów i skomentowanie ich. Dowiedziałem się, że alokacja pamięci jest specyficzna dla JVM, więc muszę powiedzieć wcześniej, że moje pytanie jest specyficzne dla Słońca.

  1. klasy (ładowane przez classloadery) idą w specjalnym obszarze na stercie: permanent Generation
  2. Wszystkie informacje związane z klasą, takie jak nazwa klasy, Tablice obiektów powiązanych z klasą, obiekty wewnętrzne używane przez JVM (takie jak java/Lang/Object) i informacje optymalizacyjne trafiają do stałego obszaru generowania.
  3. Wszystkie statyczne zmienne członkowskie są ponownie przechowywane na stałym obszarze generowania.
  4. Obiekty idą na inną kupę : młode pokolenie
  5. jest tylko jedna kopia każdej metody na klasę, być metodą statyczną lub niestatyczną. Kopia ta jest umieszczana na stałe Obszar generowania. W przypadku metod niestatycznych wszystkie parametry i zmienne lokalne trafiają na stos - i za każdym razem, gdy jest konkretne wywołanie tej metody, otrzymujemy nową ramkę stosu powiązaną z nią. Nie jestem pewien, gdzie są przechowywane zmienne lokalne statycznej metody. Czy są na stosie stałego pokolenia ? Albo po prostu ich Referencja jest przechowywana w stałym obszarze generowania, a rzeczywista kopia jest gdzieś indziej (gdzie?)
  6. nie jestem również pewien, gdzie znajduje się Typ powrotu metody get przechowywane.
  7. jeśli obiekty (w młodym pokoleniu) muszą używać elementu statycznego (w generacji stałej), otrzymują odniesienie do elementu statycznego && mają wystarczająco dużo miejsca w pamięci,aby zapisać Typ zwracanej metody, itd.

Dziękuję za przebranie przez to !

Author: Franco Rondini, 2010-10-03

1 answers

Po pierwsze, jak powinno być dla Ciebie jasne, że jest bardzo niewielu ludzi, którzy mogą potwierdzić te odpowiedzi z pierwszej ręki wiedzy. Bardzo niewiele osób pracowało nad najnowszymi hotspotami JVMs lub przestudiowało je do głębokości potrzebnej do naprawdę poznania. Większość ludzi tutaj (w tym ja) odpowiada na podstawie rzeczy, które widzieli napisane gdzie indziej lub co wywnioskowali. Zazwyczaj to, co jest napisane tutaj, lub w różnych artykułach i stronach internetowych, opiera się na innych źródłach, które mogą, ale nie muszą być ostateczne. Często jest to uproszczone, niedokładne lub po prostu błędne.

Jeśli chcesz uzyskać ostateczne potwierdzenie odpowiedzi, naprawdę musisz pobrać kod źródłowy OpenJDK ... i wykonaj własne badania , czytając i rozumiejąc kod źródłowy. Zadawanie pytań na SO, czy przeglądanie losowych artykułów internetowych nie jest solidną akademicką techniką badawczą.

Powiedziawszy to ...

1) klasy (ładowane przez classloadery) idą w specjalnym obszarze na stercie: Permanent Generacji.

AFAIK, tak. (Update : patrz poniżej.)

2) Wszystkie informacje związane z klasą jak nazwa klasy, Tablice obiektów powiązanych z klasą, wewnętrzne obiekty używane przez JVM (jak java / Lang / Object) i informacje optymalizacyjne trafiają do stałego obszaru generowania.

Mniej więcej tak. Nie wiem, co masz na myśli przez niektóre z tych rzeczy. Domyślam się, że " obiekty wewnętrzne używane przez JVM (jak java/Lang/Object)" oznaczają JVM-wewnętrzne deskryptory klas.

3) wszystkie statyczne zmienne członkowskie są ponownie przechowywane na stałym obszarze generowania.

Same zmienne tak. Zmienne te (podobnie jak wszystkie zmienne Java) będą zawierać zarówno prymitywne wartości, jak i odniesienia do obiektów. Jednakże, podczas gdy statyczne zmienne członkowskie znajdują się w ramce przydzielonej w stercie permgen, obiekty/tablice, do których odnoszą się te zmienne, mogą być przydzielone w dowolnej stercie.

4) Obiekty idą na inną stertę: młode pokolenie

Niekoniecznie. Duże obiekty mogą być przypisane bezpośrednio do danej generacji.

5) jest tylko jedna kopia każdej metody na klasę, być metodą statyczną lub niestatyczną. Kopia ta jest umieszczana w stałym obszarze generowania.

Zakładając, że odwołujesz się do kodu metody, to AFAIK tak. To może być trochę bardziej skomplikowane. Na przykład, że kod może istnieć w kod bajtowy i / lub kod natywny formuje się w różnych momentach życia JVM.

... W przypadku metod niestatycznych wszystkie parametry i zmienne lokalne trafiają na stos - i za każdym razem, gdy jest konkretne wywołanie tej metody, otrzymujemy nową ramkę stosu powiązaną z nią.

Tak.

... Nie jestem pewien, gdzie są przechowywane zmienne lokalne statycznej metody. Czy są na stosie stałego pokolenia ? Lub po prostu ich odniesienie jest przechowywane w Stały obszar generowania, a rzeczywista kopia jest gdzie indziej (gdzie?)

Nie. Są one przechowywane na stosie, podobnie jak zmienne lokalne w metodach niestatycznych.

6) nie jestem również pewien, gdzie jest przechowywany Typ zwracanej metody.

Jeśli masz na myśli wartość zwracaną przez (nie-void) wywołanie metody, to jest ona zwracana na stosie lub w rejestrze maszynowym. Jeśli zostanie zwrócony na stosie, zajmie to 1 lub 2 słowa, w zależności od Typ powrotu.

7) jeśli obiekty (w młodym pokoleniu) nie chcą używać statycznego pręta (w stałym pokoleniu), otrzymują odniesienie do statycznego pręta && mają wystarczająco dużo miejsca w pamięci,aby przechowywać Typ zwracanej metody, itd.

To jest niedokładne(a przynajmniej nie wyrażasz się jasno).

Jeśli jakaś metoda uzyskuje dostęp do statycznej zmiennej członkowskiej, otrzymuje ona albo prymitywną wartość, albo obiekt referencję . Może to być przypisane do (istniejącej) lokalnej zmiennej lub parametru, przypisane do (istniejącego) statycznego lub niestatycznego elementu, przypisane do (istniejącego) elementu wcześniej przydzielonej tablicy lub po prostu użyte i odrzucone.

  • W żadnym wypadku new storage nie musi być przydzielane do przechowywania referencji lub pierwotnej wartości.

  • Zazwyczaj jedno słowo pamięci jest wszystkim, co jest potrzebne do przechowywania odniesienia do obiektu lub tablicy, a prymitywna wartość zazwyczaj zajmuje jedno lub dwa słowa, w zależności od architektury sprzętu.

  • W żadnym wypadku wywołujący nie musi przydzielać miejsca do przechowywania obiektu / tablicy zwracanej przez metodę. W Javie obiekty i tablice są zawsze zwracane za pomocą semantyki pass-by-value ... ale zwracana wartość jest odniesieniem do obiektu lub tablicy.

UPDATE

W Javie 8 przestrzeń PermGen została zastąpiona Metaspace. Aby uzyskać więcej informacji, proszę zobacz te zasoby:

 135
Author: Stephen C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-14 04:00:47