Kata pengantar
Area memori Java terutama terdiri dari penghitung program, tumpukan mesin virtual Java, tumpukan metode lokal, tumpukan java, area metode, dan kolam runtime konstan. Artikel ini akan memperkenalkan Anda secara rinci tentang divisi dan pengecualian area memori Java. Saya tidak akan mengatakan banyak hal di bawah ini, mari kita lihat perkenalan terperinci bersama.
Area data runtime
Ketika JVM menjalankan program Java, itu membagi memori menjadi beberapa area data yang berbeda.
Penghitung program
Thread Private. Ini dapat dianggap sebagai indikator nomor baris bytecode yang dijalankan oleh utas saat ini. Karya penafsir bytecode adalah membaca instruksi bytecode berikutnya untuk dieksekusi dengan mengubah nilai jumlah ini.
Multithreading dicapai dengan mengganti utas secara bergantian dan mengalokasikan waktu eksekusi prosesor. Setiap saat, kernel hanya dapat menjalankan instruksi dalam satu utas. Untuk memulihkan posisi eksekusi yang benar setelah switching utas, setiap utas membutuhkan penghitung program independen. Inilah yang saya sebutkan di awal "Thread Private". Jika metode yang dijalankan oleh utas adalah metode Java, penghitung mencatat alamat instruksi dari bytecode mesin virtual; Jika itu adalah metode asli, nilai penghitungnya kosong. Penghitung program adalah satu -satunya area di mana tidak ada situasi OOM (OutofmemoryError) yang ditentukan dalam spesifikasi mesin virtual Java.
Java Virtual Machine Stack
Utas bersifat pribadi, dengan siklus hidup yang sama dengan utas. Java Virtual Machine Stack menjelaskan model memori metode Java: Setiap metode akan membuat bingkai tumpukan saat dieksekusi, menyimpan tabel variabel lokal, tumpukan operan, tautan dinamis, dan informasi keluar metode. Dari panggilan hingga akhir, setiap metode sesuai dengan proses entri dan keluar tumpukan bingkai tumpukan ini di tumpukan mesin virtual. Tabel variabel lokal menyimpan berbagai tipe data dasar (int, double, char, byte, dll.), Referensi objek (bukan objek itu sendiri), dan tipe returnAddress (menunjuk ke alamat bytecode).
Dua kemungkinan pengecualian di bidang ini:
Tumpukan metode lokal
Tumpukan mesin virtual di atas menjalankan layanan metode Java untuk JVM, dan metode lokal mengeksekusi layanan asli. Lainnya mirip dengan tumpukan mesin virtual, dan Stackoverflowerror dan OutofmemoryError juga akan dilemparkan.
Java Heap
Yang biasa disebut sebagai "menumpuk memori" dan "banyak memori", yang pertama mengacu pada tumpukan mesin virtual, dan yang terakhir mengacu pada tumpukan Java. Tumpukan Java dibagikan berdasarkan utas. Dibuat saat mesin virtual dimulai.
Peran tumpukan java adalah untuk menyimpan instance objek. Tumpukan Java dapat berada dalam ruang memori yang terputus secara fisik, dan hanya membutuhkan kontinu secara logis.
Area metode
Area yang dibagikan berdasarkan utas. Menyimpan data seperti informasi kelas, konstanta, variabel statis, kode yang disusun oleh kompiler, dll. Yang telah dimuat oleh mesin virtual. Ketika area metode tidak dapat memenuhi persyaratan alokasi memori, outofmemoryError dilemparkan.
Runtime Constant Pool
Runtime Constant Pool adalah bagian dari area metode. C digunakan untuk menyimpan berbagai konstanta literal dan referensi simbolik yang dihasilkan selama periode kompilasi, dan akan disimpan dalam kumpulan konstanta runtime yang memasuki area metode setelah pemuatan kelas. Bahasa Java tidak membutuhkan konstanta untuk dihasilkan hanya selama periode kompilasi. Dengan kata lain, konstanta baru dapat ditempatkan selama periode lari.
Memori langsung
Memori langsung bukan bagian dari area data runtime mesin virtual, juga bukan area memori. Alokasi memori langsung dari mesin asli tidak akan dibatasi oleh ukuran tumpukan java, tetapi memori itu. Jika jumlah setiap area memori lebih besar dari batas memori fisik, outofmemoryError akan tetap muncul.
Proses pembuatan objek
Mesin virtual menemukan instruksi "baru":
Tata Letak Memori Objek
Tata letak objek yang disimpan dalam memori dapat dibagi menjadi 3 area:
Header Objek: Menyimpan data runtime objek sendiri, seperti kode hash, usia generasi GC, bendera status kunci, kunci yang dipegang oleh utas, ID utas yang bias, dll. Bagian lain adalah tipe pointer, yaitu, penunjuk ke metadata kelas objek. Mesin virtual menggunakan pointer ini untuk menentukan contoh kelas mana objek milik.
Data instan: informasi yang benar -benar valid dari objek, konten dari berbagai jenis bidang yang ditentukan dalam program;
Suplemen Penyelarasan: Tidak penting, peran penghuni.
Posisi akses objek
Program Java mengoperasikan objek instance pada tumpukan melalui referensi pada tumpukan. Misalnya
Orang p = orang baru ();
Di sini P adalah referensi, dan objek orang yang diproduksi oleh baru adalah sebuah instance.
Referensi ini tidak menentukan cara menemukan dan mengakses lokasi spesifik objek di tumpukan. Ada dua metode akses utama:
menangani. Sepotong memori akan dibagi menjadi tumpukan java sebagai kumpulan pegangan, yang merujuk alamat pegangan objek, dan pegangan berisi data instance objek dan jenis data. Keuntungannya adalah ketika objek dipindahkan, Anda hanya perlu mengubah alamat di pegangan, dan referensi itu sendiri tidak perlu dimodifikasi.
Pointer Langsung. Alamat objek secara langsung disimpan dalam referensi. Keuntungannya adalah bahwa kecepatan lebih cepat, dan karena referensi secara langsung mewakili alamat objek instan, operasi penentuan posisi penunjuk disimpan. Beginilah persis seperti yang digunakan hotspot matahari.
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.