Pernahkah Anda bertanya-tanya seperti apa objek java dari dalam?
Di bawah kucing akan ada deskripsi rinci tentang header objek java, apa yang terdiri dari dan berapa banyak memori yang dibutuhkan.
Untuk memulainya, kita ingat bahwa dalam jvm objek apa pun dalam memori terdiri dari header objek dan variabel objek (tautan dan primitif). Juga, ukuran akhir objek dapat diperluas menjadi kelipatan 8 byte.
Judul setiap objek (kecuali untuk array) terdiri dari dua kata mesin - tandai kata dan kata kelas . Array memiliki 32 bit tambahan untuk menggambarkan panjang array.
Tandai kata menyimpan kode hash, bit yang digunakan oleh pengumpul sampah, dan bit yang digunakan untuk kunci. Anda selalu dapat menemukan rincian lebih lanjut di OpenJDK macam markOop.hpp .
Kata kelas menyimpan pointer ke kelas itu sendiri, yaitu, ke tempat di mana informasi tentang tipe data ini terletak: metode, anotasi, warisan, dan banyak lagi. Lebih detail juga selalu dapat ditemukan di OpenJDK macam klass.hpp .
Sekarang mari kita melihat lebih dekat pada judul objek, dan khususnya kata mark
32 bit jvm

Seperti yang dapat Anda lihat dari tabel, konten kata Mark dapat sangat bervariasi tergantung pada keadaan objek saat ini.
Keadaan normal objek (biased_lock = 0, kunci = 01)
- identity_hashcode adalah hash dari objek yang muncul malas. Jika objek memiliki panggilan System.identityHashCode (obj) untuk pertama kalinya, maka hash ini akan dihitung dan ditulis ke header objek.
Di negara lain, ketika berbagai aliran bersaing untuk suatu objek, identity_hashcode akan disimpan bukan di header objek, tetapi di monitor objek. - umur - jumlah pengumpulan sampah yang dialami. Ketika usia mencapai angka ambang batas maksimum,
objek bergerak ke daerah pinggul generasi tua. - biased_lock - berisi 1 jika penguncian bias diaktifkan untuk objek ini, jika tidak 0.
Sedikit lagiKetika Biased Locking dihidupkan, objek bergerak seolah-olah ke objek pertama yang menangkap monitornya. Pengambilan objek berikutnya dalam aliran yang sama akan sedikit lebih cepat.
Berikut adalah prasyarat teoritis dasar untuk kunci ini:
- Sepanjang kehidupan objek, ia dimiliki secara dominan oleh seseorang
- Jika utas baru-baru ini menggunakan kunci pada objek ini, kemungkinan besar cache prosesor masih akan berisi data yang akan diperlukan untuk menangkap kembali objek ini.
Biased Locking diaktifkan secara default sejak java 6, -XX: -UseBiasedLocking
- kunci - berisi kode status kunci. 00 - Terkunci Ringan, 01 - Tidak Terkunci atau Bias, 10 - Terkunci Berat, 11 - Ditandai untuk Pengumpulan Sampah.
Yaitu, dalam tabel, keadaan suatu objek ditentukan oleh kombinasi bit biased_lock dan kunci.
Mode Bias Terkunci (biased_lock = 1, kunci = 01)
- thread - dalam mode penguncian bias, diasumsikan bahwa objek didominasi dimiliki oleh utas tertentu, id utas ini disimpan di lapangan.
- zaman mengandung beberapa indikator sementara kepemilikan objek oleh utas yang id disimpan dalam utas
Mode Terkunci Ringan (kunci = 00)
Dalam mode ini, diasumsikan bahwa waktu penangkapan oleh objek ini oleh aliran yang berbeda tidak berpotongan sama sekali atau tidak tumpang tindih secara tidak signifikan. Dalam mode ini, alih-alih menghalangi sistem operasi, JVM menggunakan atom.
- ptr_to_lock_record - CAS (bandingkan dan set) di dalam putaran putaran digunakan untuk mengatur / menunggu kunci.
Untuk referensi, waktu pemblokiran OS minimum akan berada di wilayah sekitar 10 ms, dengan bantuan atom, alirannya tidak tertidur, tetapi terus mengirik siklus kecil, dan segera setelah sumber daya gratis, siklus atom akan berakhir dan aliran akan segera menangkap objek ini.
Mode Terkunci Berat (kunci = 10)
- ptr_to_heavyweight_monitor - jika waktu penangkapan objek ini dengan aliran berbeda akan tumpang tindih secara signifikan, maka kunci ringan akan diganti dengan kunci kelas berat. Pointer ke monitor akan ditulis ke ptr_to_heavyweight_monitor. Kunci OS digunakan.
Jadi dalam 32 bit jvm header objek terdiri dari 8 byte. Array juga memiliki 4 byte.
64 bit jvm

Pada jvm 64 bit, header objek terdiri dari 16 byte. Array juga memiliki 4 byte.
64 bit jvm dengan kompresi pointer

Header objek terdiri dari 12 byte. Array juga memiliki 4 byte.
Sedikit tentang kompresi pointer. Untuk pointer 32-bit, ruang alamat dibatasi hingga 4GB. Namun, jika kita ingat lagi bahwa dalam jvm ukuran objek adalah kelipatan 8 byte, maka kita dapat menggunakan pointer pseudo 35-bit, dengan tiga nol di ujungnya. Dan, dengan demikian, lihat sudah 32GB memori. Kompresi tidak gratis, harga merupakan operasi tambahan (penunjuk << 3) untuk setiap panggilan yang akan ditumpuk.
Tautan ke artikel asli:
Header Obyek Java
Saya juga ingin menambahkan bahwa semua yang dijelaskan di sini bukan dogma, mungkin dalam versi lain dari jvm judul objek akan berbeda. Dijelaskan di sini relevan untuk openjdk 8.