Metode statis (sebenarnya semua metode) serta variabel statis disimpan di PermGen
bagian heap, karena mereka adalah bagian dari data refleksi (data terkait kelas, bukan terkait instance).
Pembaruan untuk klarifikasi :
Perhatikan bahwa hanya variabel dan nilai teknisnya (primitif atau referensi) yang disimpan di ruang PermGen.
Jika variabel statis Anda adalah referensi ke objek, objek itu sendiri disimpan di bagian normal heap (generasi muda / tua atau ruang penyintas). Objek-objek tersebut (kecuali mereka adalah objek internal seperti kelas dll.) Tidak disimpan di ruang PermGen.
Contoh:
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.
Sepatah kata tentang pengumpulan sampah:
Jangan tidak mengandalkan finalize()
seperti itu tidak dijamin untuk menjalankan. Ini sepenuhnya tergantung pada JVM untuk memutuskan kapan menjalankan pengumpul sampah dan apa yang harus dikumpulkan, bahkan jika suatu objek memenuhi syarat untuk pengumpulan sampah.
Tentu saja Anda bisa menyetel variabel statis ke null dan dengan demikian menghapus referensi ke objek di heap, tetapi itu tidak berarti pengumpul sampah akan mengumpulkannya (meskipun tidak ada referensi lagi).
Selain finalize()
itu dijalankan hanya sekali, jadi Anda harus memastikan itu tidak membuang pengecualian atau mencegah objek untuk dikumpulkan. Jika Anda menghentikan penyelesaian melalui beberapa pengecualian, finalize()
tidak akan dipanggil pada objek yang sama untuk kedua kalinya.
Catatan terakhir : bagaimana kode, data runtime, dll. Disimpan tergantung pada JVM yang digunakan, misalnya HotSpot mungkin melakukannya secara berbeda dari JRockit dan ini bahkan mungkin berbeda di antara versi JVM yang sama. Di atas didasarkan pada HotSpot untuk Java 5 dan 6 (pada dasarnya sama) karena pada saat menjawab saya akan mengatakan bahwa kebanyakan orang menggunakan JVM tersebut. Karena perubahan besar dalam model memori pada Java 8, pernyataan di atas mungkin tidak benar untuk Java 8 HotSpot - dan saya tidak memeriksa perubahan Java 7 HotSpot, jadi saya rasa hal di atas masih berlaku untuk versi itu, tapi saya tidak yakin di sini.