Dimana Panjang Array Disimpan di JVM?

1. Ikhtisar

Dalam tutorial singkat ini, kita akan melihat bagaimana dan di mana HotSpot JVM menyimpan panjang array.

Biasanya, tata letak memori area data run-time bukan bagian dari spesifikasi JVM dan diserahkan pada kebijaksanaan implementor. Oleh karena itu, setiap implementasi JVM mungkin memiliki strategi yang berbeda untuk mengatur tata letak objek dan array dalam memori.

Dalam tutorial ini, kami berfokus pada satu implementasi JVM tertentu: HotSpot JVM. Kami juga dapat menggunakan ketentuan JVM dan HotSpot JVM secara bergantian.

2. Ketergantungan

Untuk memeriksa tata letak memori array di JVM, kita akan menggunakan alat Java Object Layout (JOL). Oleh karena itu, kita perlu menambahkan dependensi jol-core :

 org.openjdk.jol jol-core 0.10 

3. Panjang Array

HotSpot JVM menggunakan struktur data yang disebut Ordinary Object Pointers (OOPs) untuk merepresentasikan pointer ke objek. Untuk lebih spesifik, HotSpot JVM mewakili array dengan OOP khusus yang disebut arrayOop . Setiap arrayOop menyertakan header objek dengan detail berikut:

  • Satu kata tanda untuk menyimpan kode hash identitas atau informasi GC
  • Satu kata klass untuk menyimpan metadata kelas umum
  • 4 byte yang mewakili panjang array

Oleh karena itu, JVM menyimpan panjang array di header objek .

Mari verifikasi ini dengan memeriksa tata letak memori dari sebuah array:

int[] ints = new int[42]; System.out.println(ClassLayout.parseInstance(ints).toPrintable());

Seperti yang ditunjukkan di atas, kami mengurai tata letak memori dari instance array yang ada. Berikut cara JVM menjabarkan int [] :

[I object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1) # mark 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) # mark 8 4 (object header) 6d 01 00 f8 (01101101 00000001 00000000 11111000) (-134217363) #klass 12 4 (object header) 2a 00 00 00 (00101010 00000000 00000000 00000000) (42) # array length 16 168 int [I. N/A Instance size: 184 bytes

Seperti yang disebutkan sebelumnya, JVM menyimpan panjang array di dalam header objek setelah kata mark dan klass. Selain itu, panjang array akan disimpan dalam 4 byte, jadi tidak boleh lebih besar dari nilai maksimum untuk integer 32-bit.

Setelah header objek, JVM menyimpan elemen array yang sebenarnya. Karena kita memiliki array 42 bilangan bulat, ukuran total array adalah 168 byte - 42 dikalikan dengan 4.

4. Kesimpulan

Dalam tutorial singkat ini, kami melihat bagaimana JVM menyimpan panjang array.

Seperti biasa, semua contoh tersedia di GitHub.