Metody statyczne (w rzeczywistości wszystkie metody), a także zmienne statyczne są przechowywane w PermGen
sekcji sterty, ponieważ są częścią danych odbicia (dane związane z klasą, a nie z instancją).
Aktualizacja w celu wyjaśnienia :
Zauważ, że tylko zmienne i ich wartości techniczne (prymitywy lub referencje) są przechowywane w przestrzeni PermGen.
Jeśli zmienna statyczna jest odniesieniem do obiektu, sam obiekt jest przechowywany w normalnych sekcjach sterty (przestrzeń młodego / starego pokolenia lub ocalałego). Te obiekty (chyba że są to obiekty wewnętrzne, takie jak klasy itp.) Nie są przechowywane w przestrzeni PermGen.
Przykład:
static int i = 1; //the value 1 is stored in the PermGen section
static Object o = new SomeObject(); //the reference(pointer/memory address) is stored in the PermGen section, the object itself is not.
Słowo na temat zbierania śmieci:
Czy nie polegać na finalize()
, ponieważ nie ma gwarancji, aby uruchomić. To JVM całkowicie decyduje, kiedy uruchomić moduł odśmiecania pamięci i co zbierać, nawet jeśli obiekt kwalifikuje się do czyszczenia pamięci.
Oczywiście można ustawić zmienną statyczną na null, a tym samym usunąć odwołanie do obiektu na stercie, ale to nie znaczy, garbage collector będzie je zbierać (nawet jeśli nie ma więcej odniesień).
Dodatkowo finalize()
jest uruchamiany tylko raz, więc musisz się upewnić, że nie zgłasza wyjątków lub w inny sposób nie zapobiega gromadzeniu obiektu. Jeśli zatrzymasz finalizację finalize()
z powodu jakiegoś wyjątku, nie zostanie wywołany na tym samym obiekcie po raz drugi.
Ostatnia uwaga : sposób przechowywania kodu, danych uruchomieniowych itp. Zależy od używanej maszyny JVM, tj. HotSpot może robić to inaczej niż JRockit, a to może się nawet różnić między wersjami tej samej maszyny JVM. Powyższe jest oparte na HotSpot dla Javy 5 i 6 (te są w zasadzie takie same), ponieważ w momencie odpowiadania powiedziałbym, że większość ludzi korzystała z tych maszyn JVM. Ze względu na duże zmiany w modelu pamięci od wersji Java 8 powyższe stwierdzenia mogą nie być prawdziwe dla Java 8 HotSpot - i nie sprawdzałem zmian w Java 7 HotSpot, więc myślę, że powyższe jest nadal prawdziwe dla tej wersji, ale tutaj nie jestem pewien.