1. Gambaran keseluruhan
Dalam tutorial ringkas ini, kita akan melihat bagaimana mencari alamat memori objek di Java.
Sebelum melangkah lebih jauh, perlu disebutkan bahawa susun atur memori kawasan data runtime bukan sebahagian dari spesifikasi JVM dan diserahkan kepada budi bicara pelaksana. Oleh itu, setiap pelaksanaan JVM mungkin mempunyai strategi yang berbeza untuk menyusun objek dan susunan dalam memori. Ini seterusnya akan mempengaruhi alamat memori.
Dalam tutorial ini, kami memfokuskan pada satu pelaksanaan JVM khusus: HotSpot JVM. Kami juga boleh menggunakan istilah JVM dan HotSpot JVM secara bergantian sepanjang tutorial.
2. Kebergantungan
Untuk mencari alamat memori objek di JVM, kita akan menggunakan alat Java Object Layout (JOL). Oleh itu, kita perlu menambahkan kebergantungan jol-core :
org.openjdk.jol jol-core 0.10
3. Alamat Memori
Untuk mencari alamat memori objek tertentu di JVM, kita dapat menggunakan kaedah addressOf () :
String answer = "42"; System.out.println("The memory address is " + VM.current().addressOf(answer));
Ini akan mencetak:
The memory address is 31864981224
Terdapat mod rujukan termampat yang berbeza di HotSpot JVM. Oleh kerana mod ini, nilai ini mungkin tidak tepat sepenuhnya. Oleh itu, kita tidak boleh melakukan dan melakukan manipulasi memori asli berdasarkan alamat ini, kerana ia boleh menyebabkan kerosakan memori pelik.
Juga, alamat memori di kebanyakan implementasi JVM dapat berubah sewaktu GC menggerakkan objek dari semasa ke semasa.
4. Kod Hash Identiti
Terdapat kesalahpahaman umum bahawa alamat memori objek di JVM direpresentasikan sebagai sebahagian daripada implementasi default mereka ke String , seperti [dilindungi e-mel] . Artinya, banyak yang berpendapat bahawa "60addb54" adalah alamat memori objek tertentu.
Mari periksa andaian ini:
Object obj = new Object(); System.out.println("Memory address: " + VM.current().addressOf(obj)); System.out.println("toString: " + obj); System.out.println("hashCode: " + obj.hashCode()); System.out.println("hashCode: " + System.identityHashCode(obj));
Ini akan mencetak perkara berikut:
Memory address: 31879960584 toString: [email protected] hashCode: 1622006612 hashCode: 1622006612
Cukup menarik, "60addb54" adalah versi heksadesimal kod hash, yaitu 1622006612. Kaedah hashCode () adalah salah satu kaedah umum untuk semua objek Java. Apabila kita tidak menyatakan kaedah hashCode () untuk kelas, Java akan menggunakan kod hash identiti untuknya.
Seperti yang ditunjukkan di atas, kod hash identiti (bahagian selepas @ di toString ) dan alamat memori berbeza .
5. Kesimpulan
Dalam tutorial ringkas ini, kami melihat cara mencari alamat memori objek di Java.
Seperti biasa, semua contoh boleh didapati di GitHub.