1. Konsep Dasar
Setiap program Java berjalan akan menghasilkan proses Java. Setiap proses Java dapat berisi satu atau lebih utas. Setiap proses Java sesuai dengan instance JVM yang unik, setiap instance JVM sesuai dengan tumpukan, dan setiap utas memiliki tumpukan pribadi sendiri. Semua contoh kelas (yaitu, objek) atau array (mengacu pada array itu sendiri, bukan referensi) yang dibuat oleh suatu proses ditempatkan di tumpukan dan dibagikan oleh semua utas proses. Memori heap yang dialokasikan di Java secara otomatis diinisialisasi, yaitu, ketika mengalokasikan memori ke suatu objek, variabel dalam objek akan diinisialisasi. Meskipun ruang penyimpanan semua objek di Java dialokasikan dalam tumpukan, referensi untuk objek ini dialokasikan dalam tumpukan, yaitu ketika suatu objek dibuat, memori dialokasikan dalam tumpukan dan tumpukan. Memori yang dialokasikan dalam tumpukan sebenarnya menyimpan objek yang dibuat itu sendiri, sedangkan memori yang dialokasikan di tumpukan hanya menyimpan referensi ke objek heap. Ketika variabel lokal baru keluar, ruang dialokasikan di ruang tumpukan dan ruang tumpukan. Ketika siklus hidup variabel lokal berakhir, ruang tumpukan segera didaur ulang, dan area ruang tumpukan sedang menunggu GC mendaur ulang.
Konsep Khusus: Memori JVM dapat dibagi menjadi tiga area: tumpukan, tumpukan dan area metode (metode, juga disebut area statis):
Area tumpukan:
1. Semua disimpan adalah objek, dan setiap objek berisi informasi yang sesuai dengannya (tujuan kelas adalah untuk mendapatkan instruksi operasi);
2.JVM hanya memiliki satu area tumpukan (tumpukan) dan dibagikan oleh semua utas. Tumpukan tidak menyimpan tipe dasar dan referensi objek, tetapi hanya objek itu sendiri dan array itu sendiri;
Area tumpukan:
1. Setiap utas berisi area tumpukan, yang hanya menyimpan referensi ke tipe data dasar itu sendiri dan objek khusus;
2. Data (tipe primitif dan referensi objek) di setiap tumpukan bersifat pribadi dan tidak dapat diakses oleh tumpukan lain;
3. Tumpukan dibagi menjadi 3 bagian: area variabel tipe dasar, konteks lingkungan eksekusi, dan area instruksi operasi (menyimpan instruksi operasi);
Area metode (area statis):
1. Dibagikan oleh semua utas. Area metode berisi semua kelas (kelas mengacu pada kode asli kelas. Untuk membuat objek kelas, kode kelas harus dimuat ke dalam area metode dan diinisialisasi) dan variabel statis.
2. Area metode berisi elemen yang selalu unik di seluruh program, seperti variabel kelas dan statis.
2. Contoh demonstrasi
Appmain.java
Public Class AppMain // Saat berjalan, JVM menempatkan semua kode AppMain ke dalam area metode {public static void main (string [] args) // metode utama itu sendiri ditempatkan di area metode. {Sampel test1 = sampel baru ("tes 1"); // test1 adalah referensi, jadi letakkan di area tumpukan, sampel adalah objek khusus, yang harus ditempatkan di tumpukan. Sampel test2 = sampel baru ("tes 2"); test1.printname (); test2.printname (); }} sampel kelas publik // Saat berjalan, JVM menempatkan semua informasi AppMain ke dalam area metode { /** contoh nama* /nama string privat; // Setelah contoh contoh baru, referensi nama ditempatkan di area tumpukan, nama objek string yang sesuai ditempatkan di heap/** konstruktor*/sampel publik (nama string) {this .name = name; } /** Output* /public void printName () // Ketika tidak ada objek, metode cetak ditempatkan di area metode bersama dengan kelas sampel. {System.out.println (name); }}Saat menjalankan program, pertama -tama mulai proses mesin virtual Java. Proses ini pertama kali menemukan file appmain.class dari ClassPath, membaca data biner dalam file, dan kemudian menyimpan informasi kelas kelas AppMain di area metode area data runtime. Ini adalah proses pemuatan kelas AppMain.
Selanjutnya, mesin virtual Java menempatkan bytecode metode utama () dari kelas AppMain di area metode dan mulai mengeksekusi instruksinya. Pernyataan pertama dari metode utama () ini adalah:
Salinan kode adalah sebagai berikut:
Sampel test1 = sampel baru ("test1");
Proses eksekusi pernyataan ini:
1. Mesin virtual Java menemukan informasi jenis kelas sampel di area metode, tetapi tidak ditemukan, karena kelas sampel belum dimuat ke dalam area metode (dapat dilihat di sini bahwa kelas internal di Java ada secara terpisah, dan pada awalnya, tidak akan dimuat dengan kelas yang berisi, dan tidak akan dimuat sampai digunakan). Mesin virtual Java segera memuat kelas sampel dan menyimpan informasi jenis kelas sampel di area metode.
2. Mesin virtual Java pertama mengalokasikan memori untuk contoh sampel baru di area heap, dan menyimpan alamat memori di area metode di mana informasi jenis kelas sampel disimpan dalam memori contoh contoh.
3. Dalam proses JVM, masing -masing utas akan memiliki tumpukan panggilan metode, yang digunakan untuk melacak serangkaian proses panggilan metode selama utas berjalan. Setiap elemen dalam tumpukan disebut bingkai tumpukan. Setiap kali utas memanggil metode, bingkai baru akan didorong ke tumpukan metode. Bingkai di sini digunakan untuk menyimpan parameter metode, variabel lokal, dan data sementara selama operasi.
4. Test1 Sebelum "=" adalah variabel (referensi ke objek sampel) yang ditentukan dalam metode utama (), sehingga akan ditambahkan ke tumpukan panggilan metode java dari utas utama yang menjalankan metode utama (). Dan "=" akan mengarahkan variabel test1 ini ke instance sampel di area heap.
5. JVM terus membuat contoh sampel lain di area heap, dan menambahkan variabel test2 ke tumpukan panggilan metode metode utama, yang menunjuk ke instance sampel baru yang baru saja dibuat di area heap.
6. JVM mengeksekusi metode printName () mereka pada gilirannya. Ketika mesin virtual Java mengeksekusi metode test1.printname (), mesin virtual Java menempatkan contoh sampel di area heap berdasarkan referensi yang dipegang oleh variabel lokal1, dan kemudian menempatkan informasi jenis kelas sampel dalam metode yang diadakan oleh contoh yang dimiliki oleh pengajaran dalam metode cetak (dan kemudian) di dalamnya.
AKU AKU AKU. Membedakan
Perbedaan antara tumpukan dan tumpukan dalam bahasa Java:
1. Stack dan Heap adalah keduanya tempat yang digunakan oleh Java untuk menyimpan data dalam RAM. Tidak seperti C ++, Java secara otomatis mengelola tumpukan dan tumpukan, dan pemrogram tidak dapat mengatur tumpukan atau tumpukan secara langsung.
2. Keuntungan dari tumpukan adalah bahwa kecepatan akses lebih cepat dari tumpukan, kedua setelah register yang terletak langsung di CPU. Tetapi kerugiannya adalah bahwa ukuran data dan masa pakai dalam tumpukan harus deterministik dan tidak memiliki fleksibilitas. Selain itu, data tumpukan dapat dibagikan (lihat Pendahuluan di bawah ini untuk detailnya). Keuntungan dari tumpukan adalah bahwa ia secara dinamis dapat mengalokasikan ukuran memori, dan masa pakai tidak harus diberitahu kepada kompiler terlebih dahulu. Pengumpul sampah Java akan secara otomatis mengumpulkan data yang tidak lagi digunakan. Tetapi kerugiannya adalah bahwa memori harus dialokasikan secara dinamis saat runtime, kecepatan akses lebih lambat.
2 tipe data di java:
Salah satunya adalah tipe primitif, dengan 8 kategori, yaitu int, pendek, panjang, byte, float, double, boolean, char (perhatikan bahwa tidak ada jenis string dasar). Jenis definisi ini didefinisikan oleh bentuk seperti int a = 3; long b = 255L; dan disebut variabel otomatis. Variabel otomatis memiliki nilai literal, bukan contoh kelas, yaitu, mereka bukan referensi ke kelas, dan tidak ada kelas di sini. Misalnya, int a = 3; Di sini A adalah referensi yang menunjuk ke tipe int, menunjuk pada nilai literal 3. Karena ukuran dan masa pakai data literal ini, nilai -nilai literal ini secara tetap didefinisikan dalam blok program, dan nilai lapangan menghilang setelah blok program keluar), dan ada di tumpukan demi kecepatan mengejar.
Tumpukan memiliki fitur yang sangat penting: data yang ada di tumpukan dapat dibagikan. Misalkan kita mendefinisikan pada saat yang sama: int a = 3; int b = 3; Kompiler pertama proses int a = 3; Pertama akan membuat referensi dengan variabel A di tumpukan, dan kemudian cari tahu apakah ada alamat dengan nilai literal 3. Jika tidak ditemukan, itu akan membuka alamat dengan nilai literal 3, dan kemudian titik A ke alamat 3. Kemudian proses int B = 3; Setelah membuat variabel referensi B, karena sudah ada nilai literal 3 di tumpukan, B secara langsung menunjuk ke alamat 3. Dengan cara ini, A dan B keduanya menunjuk ke 3 pada saat yang sama.
Referensi ke nilai -nilai literal ini berbeda dari objek kelas. Dengan asumsi bahwa referensi dua objek kelas menunjuk ke suatu objek pada saat yang sama, jika satu variabel referensi objek mengubah keadaan internal objek, variabel referensi objek lainnya segera mencerminkan perubahan ini. Sebaliknya, memodifikasi nilainya melalui referensi literal tidak akan menyebabkan nilai lain diubah sesuai. Seperti dalam contoh di atas, setelah kita mendefinisikan nilai -nilai a dan b, biarkan a = 4; Kemudian, B tidak akan sama dengan 4, atau sama dengan 3. Di dalam kompiler, ketika a = 4 ditemui, itu akan mencari kembali apakah ada nilai literal 4 di tumpukan. Jika tidak, buka kembali alamat untuk menyimpan nilai 4; Jika sudah ada, langsung tunjuk A ke alamat ini. Oleh karena itu, perubahan nilai A tidak akan mempengaruhi nilai b.
Jenis lain adalah data pengemasan data, seperti integer, string, double, dll. Yang membungkus tipe data dasar yang sesuai. Semua data kelas ini ada di tumpukan. Java menggunakan pernyataan baru () untuk menampilkan kompiler dan hanya menciptakan secara dinamis sesuai kebutuhan saat runtime, sehingga lebih fleksibel, tetapi kerugiannya adalah memakan waktu lebih banyak.
4. Ringkasan
Struktur alokasi memori Java masih sangat jelas. Jika Anda ingin memahaminya secara menyeluruh, Anda dapat memeriksa buku-buku terkait JVM. Di Java, hal yang paling merepotkan tentang alokasi memori adalah objek string. Karena sifatnya yang istimewa, banyak programmer rentan terhadap kebingungan. Saya akan menjelaskannya secara rinci di artikel berikutnya.