Sebagai contoh:
class A {
static int i=0;
static int j;
static void method() {
// static k=0; can't use static for local variables only final is permitted
// static int L;
}
}
Di mana variabel ini akan disimpan di Java, di heap, atau di memori tumpukan? Bagaimana cara menyimpannya?
Jawaban:
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:
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.
sumber
Variabel kelas (variabel statis) disimpan sebagai bagian dari yang
Class object
terkait dengan kelas itu. Objek Kelas ini hanya dapat dibuat oleh JVM dan disimpan dipermanent generation
.Juga ada yang menjawab bahwa itu disimpan di area non heap yang disebut
Method Area.
Bahkan jawaban ini tidak salah. Ini hanya topik yang bisa diperdebatkan apakah Permgen Area adalah bagian dari heap atau bukan. Jelas, persepsi berbeda dari orang ke orang. Menurut pendapat saya, kami memberikan ruang heap dan ruang permgen berbeda dalam argumen JVM. Jadi adalah asumsi yang baik untuk memperlakukan mereka secara berbeda.Cara lain untuk melihatnya
Pool memori dibuat oleh manajer memori JVM selama runtime. Pool memori dapat dimiliki oleh memori heap atau non-heap. Kumpulan konstanta waktu proses adalah representasi run time per kelas atau per antarmuka dari tabel constant_pool dalam file kelas. Setiap kumpulan konstan runtime dialokasikan dari area metode mesin virtual Java dan Variabel Statis disimpan di Area Metode ini. Juga non-heap ini tidak lain adalah area perm gen. Sebenarnya area Metode adalah bagian dari perm gen. ( Referensi )
sumber
Also this non-heap is nothing but perm gen area.Actually Method area is part of perm gen.
Sebelum Java 8:
Variabel statis disimpan di ruang permgen (juga disebut area metode).
PermGen Space juga dikenal sebagai Area Metode
PermGen Space digunakan untuk menyimpan 3 benda
Dari Java 8 dan seterusnya
Variabel statis disimpan di Heap itu sendiri. Dari Java 8 dan seterusnya, PermGen Space telah dihapus dan ruang baru bernama MetaSpace diperkenalkan yang bukan merupakan bagian dari Heap lagi seperti Permgen Space sebelumnya. Meta-Space hadir di memori asli (memori yang disediakan oleh OS ke Aplikasi tertentu untuk penggunaannya sendiri) dan sekarang hanya menyimpan meta-data kelas.
String internal dan variabel statis dipindahkan ke heap itu sendiri.
Untuk informasi resmi, lihat: JEP 122: Hapus Ruang Gen Permanen
sumber
Ini adalah pertanyaan dengan jawaban sederhana dan jawaban bertele-tele.
Jawaban sederhananya adalah heap. Kelas dan semua data yang berlaku untuk kelas (bukan data contoh) disimpan di bagian Generasi Permanen dari heap.
Jawaban panjangnya sudah di stack overflow:
Ada deskripsi lengkap tentang memori dan pengumpulan sampah di JVM serta jawaban yang berbicara lebih ringkas tentangnya.
sumber
Itu disimpan di heap yang direferensikan oleh definisi kelas. Jika Anda memikirkannya, ini tidak ada hubungannya dengan tumpukan karena tidak ada ruang lingkup.
sumber
Selain jawaban Thomas, variabel statis disimpan di area non heap yang disebut Area Metode.
sumber
Karena variabel statis adalah variabel tingkat kelas, mereka akan menyimpan " generasi permanen " memori heap. Silakan lihat ini untuk detail lebih lanjut tentang JVM. Berharap ini bisa membantu
sumber
variabel statis disimpan di heap
sumber