Jvmmemorymodel
Artikel ini terutama memperkenalkan area data runtime (runtimedataareas) yang dijelaskan dalam spesifikasi JVM. Area ini dirancang untuk menyimpan data yang digunakan oleh JVM itu sendiri atau program yang berjalan di JVM.
Mari kita tinjauan umum pertama JVM, lalu perkenalkan bytecode, dan akhirnya memperkenalkan area data yang berbeda.
Ringkasan
Sebagai abstraksi dari sistem operasi, JVM memastikan bahwa kode yang sama berperilaku konsisten pada perangkat keras atau sistem operasi yang berbeda.
Misalnya:
Untuk tipe dasar int, ini adalah integ yang ditandatangani 32-bit terlepas dari sistem operasi 16-bit/32-bit/64-bit. Berkisar dari -2^31 hingga 2^31-1
Terlepas dari apakah sistem operasi atau perangkat keras adalah urutan byte besar atau kecil, dipastikan bahwa data dalam memori yang disimpan dan digunakan oleh JVM adalah urutan byte besar atau kecil (baca byte bit tinggi terlebih dahulu)
Implementasi JVM yang berbeda mungkin agak berbeda, tetapi umumnya sama.
Gambar di atas adalah gambaran umum dari JVM
JVM menginterpretasikan bytecode yang dihasilkan kompiler. Meskipun JVM adalah singkatan dari mesin virtual Java, selama itu adalah bahasa yang dapat dikompilasi ke dalam bytecode, itu dapat dijalankan berdasarkan JVM, seperti Scala, Groovy <� "/kf/ware/vc/" target = "_ blank"> vcd4ncjxwps6qwcux3mpixrw3sbxetmxfzekvt6os19a92slru+gxu2nsyxnzbg9hzgvyvnpu2lkiu7q05r W91MVQ0MQXYV2+3CF41TC1XNK7UPBH+NPYO6ZWQRXAVNPU2MV8TCRJBGFZC2XVYWRLCRG7Z/Q72BVY1D9KVK3NO9A51MVQ0KGJPC 9WPG0KPHA+VNPU2LXE19A92SLRZAI5/DA00NDS/CFMKGV4ZWN1DGLVBIBLBMDPBMUPVFJQ0L3IYS26ZDA00NA8L3A+DQO8CD7WT NDQ0V3H5TDO0QQ05RSIS8ZQ8SNPZ8LOXKOSSCJI57PM0PLWTNDQTB3EXNK70NCJRLVY1D/K/B7DVMBL47XE1TC85L3HUFS8L3A+D. QO8CD7WTNDQ0V3H5TKYULRU8LSMWO3T67XXSUOY2DF3Z7XNS7XEVBU7PTWVCD4NNCJXWPIOQUTY24EPWTBA8YRXP1SHLVLTKSBHG 0UU5PSTCKEPJVD1QDXN0IGLUIHRPBWUPOANKSVS+ZCRHSNG+RBOJ1RTQ0LXETPRC6YJIYLXJTPRC6YMX4NLRS8MXVRXYTPRC6YHO Yxrpdmugq29kzsmho7tmt8vksvs4nlryfqzybt6wuu1xmf40/kzxs6qpc9wpg0kpha+tprc67u6tobh+chdb2rlienh Y2gpoao8tmqxseds67y8yvuosklukby2tpo1xmzhun/by0pwtbxe0nte3coqpc9wpg0kpggyiglkpq == "berbasis stack Arsitektur "> Arsitektur Berbasis Tumpukan
JVM menggunakan arsitektur berbasis tumpukan. Meskipun tumpukan transparan untuk pengembang, ia memiliki peran atau pengaruh yang sangat penting pada bytecode dan JVM yang dihasilkan.
Program yang kami kembangkan akan mengonversi operasi tingkat rendah dan menyimpannya dalam bytecode. Peta ke instruksi operasi melalui operan di JVM. Menurut spesifikasi JVM, parameter yang diperlukan oleh instruksi operasi diperoleh dari tumpukan operan.
Mari kita berikan contoh menambahkan dua angka. Operasi ini disebut IADD. Berikut ini adalah proses 3+4 dalam bytecode
Pertama dorong 3 dan 4 ke dalam tumpukan operan
Hubungi Arahan IADD
Instruksi IADD memunculkan 2 angka dari bagian atas tumpukan operan
Hasil 3+4 didorong ke tumpukan operan untuk digunakan nanti
Pendekatan ini disebut arsitektur berbasis tumpukan. Ada cara lain untuk menangani operasi tingkat rendah, seperti arsitektur berbasis register.
Bytecode
Java Bytecode adalah hasil dari mengubah kode sumber Java menjadi serangkaian operasi tingkat rendah. Setiap operasi terdiri dari kode opcode atau operasi dengan parameter panjang nol atau lebih byte (tetapi sebagian besar operasi menggunakan parameter yang diperoleh melalui tumpukan operan). Satu byte dapat mewakili 256 angka, dari 0x00 hingga 0xff, dan saat ini ke Java8, total 204 digunakan.
Berikut ini mencantumkan berbagai jenis opcode bytecode, serta rentang dan deskripsi sederhana
Konstanta: Dorong nilai kumpulan konstan atau nilai yang diketahui ke dalam tumpukan operan. 0x00 - 0x14
Loads: Dorong nilai variabel lokal ke tumpukan operan. 0x15 - 0x35
Toko: Nilai pemuatan dari tumpukan operan ke variabel lokal 0x36 - 0x56
Stack: Proses Operand Stack 0x57 - 0x5f
Matematika: Dapatkan nilai dari tumpukan operan untuk perhitungan matematika dasar 0x60 - 0x84
Konversi: Konversi antar jenis 0x85 - 0x 93
Comaprisons: Operasi Perbandingan Dua Nilai 0x94 - 0xa6
Kontrol: Jalankan Goto, Return, Loop, dll. Operasi Kontrol 0xA7 - 0xB1
Referensi: Mengeksekusi objek atau array alokasi, dan memperoleh atau memeriksa referensi ke objek, metode, dan metode statis. Metode statis juga dapat dipanggil. 0xB2 - OXC3
Extended: Extended: Operasi dari kategori lain yang ditambahkan setelahnya. Dari nilai 0xc4 hingga 0xc9
(Apa arti kalimat ini?.....
Dicadangkan: Implementasi JVM menggunakan slot 0xCA, OXFE, OXFF
204 operasi ini sangat sederhana, berikan beberapa contoh
ifeq (0x99) menentukan apakah kedua nilai tersebut sama
IADD (0x60) menambahkan dua angka
I2L (0x85) mengonversi int sedikit
arraylength (0xbe) mengembalikan panjang array
Pop (0x57) Pop nilai dari bagian atas tumpukan operan
Kami membutuhkan kompiler untuk membuat file bytecode, dan kompiler Java standar adalah Javac di JDK.
tes kelas publik {public static void main (string [] args) {int a = 1; int b = 15; int result = add (a, b); } public static int add (int a, int b) {int result = a + b; hasil pengembalian; }}Anda bisa mendapatkan file bytecode "test.class" melalui "javac test.java". File bytecode adalah biner, kami dapat mengonversi file bytecode biner menjadi formulir teks melalui javap
Java -Verbose test.class
Classfile /c:/tmp/test.class terakhir dimodifikasi 1 avr. 2015; size 367 bytes MD5 checksum adb9ff75f12fc6ce1cdde22a9c4c7426 Compiled from "Test.java"public class com.codinggeek.jvm.Test SourceFile: "Test.java" minor version: 0 major version: 51 flags: ACC_PUBLIC, ACC_SUPERConstant pool: #1 = Methodref #4.#15 // java/lang/objek. "<inin>" :() v #2 = MethodRef #3. #16 // com/codinggeek/jvm/test.add: (ii) i #3 = kelas #17 // com/codinggeek/jvm/test #4 = kelas #18 // java/lang/objek #5 = init/init = init #; LineNumberTable #9 = Utf8 main #10 = Utf8 ([Ljava/lang/String;)V #11 = Utf8 add #12 = Utf8 (II)I #13 = Utf8 SourceFile #14 = Utf8 Test.java #15 = NameAndType #5:#6 // "<init>":()V #16 = NameAndType #11:#12 // add:(II)I #17 = Utf8 com/codinggeek/jvm/tes #18 = utf8 java/lang/objek {public com.codinggeek.jvm.test (); Bendera: Kode ACC_PUBLIC: stack = 1, penduduk setempat = 1, args_size = 1 0: aload_0 1: Invokespecial #1 // Metode java/lang/objek. "<inin>" :() v 4: return linenumberTable: line 3: 0 public static void main (java.Lang.string []); flags: ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=4, args_size=1 0: iconst_1 1: istore_1 2: bipush 15 4: istore_2 5: iload_1 6: iload_2 7: invokestatic #2 // Method add:(II)I 10: istore_3 11: return LineNumberTable: line 6: 0 line 7: 2 line 8: 5 Baris 9: 11 Public Static Inc Add (int, int); Bendera: ACC_PUBLIC, ACC_STATIC KODE: Stack = 2, penduduk setempat = 3, args_size = 2 0: iload_0 1: iload_1 2: iadd 3: iStore_2 4: iload_2 5: Ireeturn LinenumberTable: baris 12: 0 baris 13: 4}Dapat dilihat bahwa bytecode bukan hanya terjemahan sederhana dari kode java, itu termasuk:
Deskripsi kolam yang konstan dari kelas. Kolam konstan adalah area data JVM yang digunakan untuk menyimpan metadata kelas, seperti nama metode, daftar parameter, dll. Di dalam kelas. Saat JVM memuat kelas, metadata akan dimuat ke kolam konstan
Berikan informasi posisi spesifik fungsi dan variabel tmall dalam bytecode melalui tabel nomor baris dan tabel variabel lokal.
Terjemahan Kode Java (termasuk konstruksi kelas induk tersembunyi)
Memberikan operasi yang lebih spesifik pada tumpukan operan dan cara yang lebih lengkap untuk lulus dan mendapatkan parameter
Di bawah ini adalah deskripsi sederhana dari informasi penyimpanan file bytecode
ClassFile {U4 Magic; u2 minor_version; u2 mayor_version; u2 constant_pool_count; cp_info constant_pool [constant_pool_count-1]; u2 access_flags; u2 this_class; u2 super_class; u2 antarmuka_count; antarmuka u2 [antarmuka_count]; u2 fields_count; Field_info Fields [fields_count]; u2 atribute_count; atribute_info atribut [atributes_count];}Area data runtime
Area data runtime adalah area memori yang dirancang untuk menyimpan data. Data ini untuk digunakan oleh pengembang atau JVM secara internal.
Tumpukan
Tumpukan dibuat ketika JVM dimulai dan dibagikan oleh semua utas JVM. Semua instance dan array kelas dialokasikan ke tumpukan (dibuat oleh baru).
Tumpukan harus dikelola oleh pengumpul sampah, yang bertanggung jawab untuk melepaskan objek yang dibuat oleh pengembang dan tidak akan digunakan lagi.
Adapun strategi pengumpulan sampah, ditentukan oleh implementasi JVM (misalnya, Hotspot menyediakan beberapa algoritma).
Ada batas maksimum untuk heap memori. Jika nilai ini terlampaui, JVM akan melempar pengecualian outofmemroy.
Area metode
Area metode ini juga dibagikan oleh semua utas JVM. Hal yang sama dibuat dengan startup JVM. Data yang disimpan dalam area metode dimuat dari bytecode oleh ClassLoader, yang akan ada secara konsisten selama menjalankan aplikasi, kecuali classloader memuatnya dihancurkan atau JVM dihentikan.
Area metode menyimpan data berikut:
Informasi kelas (nama atribut, nama metode, nama kelas induk, nama alasan, versi, dll.)
Metode dan bytecode yang dibangun
Runtime Constant Pool dibuat saat memuat setiap kelas
Spesifikasi JVM tidak memaksa area metode untuk diimplementasikan di tumpukan. Sebelum Java7, hotspot menerapkan zona metode menggunakan wilayah yang disebut permgen. Pita permanen berdekatan dengan heap (manajemen memori sama dengan tumpukan), bit default adalah 64MB
Mulai dari Java8, HPTSPOT menggunakan memori lokal yang terpisah untuk mengimplementasikan area metode dan menamai area metadata (Metaspace). Ruang maksimum yang tersedia di area metadata adalah memori yang tersedia dari seluruh sistem.
Jika metode tidak dapat berlaku untuk memori yang tersedia, JVM juga akan melempar OutofMemoryError.
Runtime Constant Pool
Runtime Constant Pool adalah bagian dari area metode. Karena pentingnya menjalankan kolam konstan ke metadata, itu dijelaskan secara terpisah dalam spesifikasi Java di luar area metode. Runtime Constant Pool tumbuh dengan kelas dan antarmuka yang dimuat.
Kolam konstan adalah sedikit tabel sintaks dalam bahasa tradisional. Dengan kata lain, ketika kelas, metode, atau properti disebut, JVM mencari alamat nyata data ini dalam memori melalui runtime constant pool. Runtime Constant Pool juga berisi konstanta literal string atau tipe primitif
Stirng myString = "Ini adalah string litteral" statis int int my_constant = 2;
PC (Penghitung Program) Daftar (per utas) Register PC (per utas)
Setiap utas memiliki register PC (Program Counter) sendiri, yang dibuat bersama dengan pembuatan utas. Setiap utas hanya dapat menjalankan satu metode pada titik waktu, disebut metode saat ini dari utas. Daftar PC berisi alamat JVM yang saat ini menjalankan instruksi (di area metode).
Jika metode yang saat ini dijalankan adalah metode lokal, nilai register PC tidak ditentukan
Tumpukan Mesin Virtual Per Thread-Java-Virtual-Machine-Stacks-Per-Thread "> Virtual Machine Stack (per utas) Java Virtual Machine Stacks (per utas)
Stack Machine Virtual menyimpan banyak bingkai, jadi sebelum menggambarkan tumpukan, mari kita lihat bingkai terlebih dahulu.
Bingkai
Bingkai adalah struktur data yang berisi beberapa data yang mewakili metode saat ini yang dijalankan oleh utas:
Operand Stack: Seperti yang disebutkan sebelumnya, instruksi bytecode menggunakan tumpukan operan untuk lulus parameter
Array Variabel Lokal: Array ini berisi semua variabel lokal dalam ruang lingkup metode yang saat ini dieksekusi. Array ini dapat berisi tipe primitif, referensi, atau alamat pengembalian. Ukuran array variabel lokal ditentukan pada waktu kompilasi. JVM menggunakan variabel lokal untuk melewati parameter saat memanggil metode, dan array variabel lokal dari metode yang dipanggil dibuat melalui tumpukan operan metode panggilan.
Runtime Konstanta Referensi Konstanta: Referensi ke kumpulan konstan dari metode saat ini dari kelas saat ini. JVM menggunakan referensi kumpulan konstan untuk memberikan sinyal ke referensi memori nyata.
Tumpukan (tumpukan)
Setiap utas JVM memiliki tumpukan JVM pribadi, yang dibuat bersamaan dengan utas. Java Virtual Machine Stack menyimpan bingkai. Setiap kali metode disebut, bingkai dibuat dan didorong ke tumpukan mesin virtual. Ketika metode ini dijalankan, bingkai juga akan dihancurkan (terlepas dari apakah metode tersebut dieksekusi secara normal atau pengecualian dilemparkan)
Hanya satu bingkai yang tersedia selama pelaksanaan utas. Bingkai ini disebut bingkai saat ini.
Operasi pada variabel lokal dan tumpukan operan biasanya disertai dengan referensi ke bingkai saat ini.
Mari kita lihat contoh penambahan lain
public int add (int a, int b) {return a + b;} public void functionA () {// Beberapa kode tanpa fungsi panggilan int result = add (2,3); // Panggilan untuk berfungsi b // beberapa kode tanpa fungsi panggilan}Di dalam metode A, bingkai A adalah bingkai saat ini, yang terletak di bagian atas tumpukan mesin virtual. Pada awal memanggil metode Tambah, bingkai B baru dibuat dan didorong ke tumpukan mesin virtual. Bingkai B menjadi bingkai saat ini baru.
Array variabel lokal bingkai B diisi dengan data dalam tumpukan operan bingkai A. Ketika metode tambah berakhir, bingkai B dihancurkan dan bingkai A dibangun kembali sebagai bingkai saat ini. Hasil dari metode ADD didorong ke tumpukan operan bingkai A, sehingga metode A dapat memperoleh hasil add melalui tumpukan operan bingkai A.
Meringkaskan
Di atas adalah semua tentang analisis area data Java Virtual Machine Runtime. Saya harap ini akan membantu semua orang.
Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya.