Di manakah Panjang Array Disimpan di JVM?

1. Gambaran keseluruhan

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

Biasanya, susun atur memori kawasan data jangka masa bukan sebahagian daripada 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.

Dalam tutorial ini, kami memfokuskan pada satu pelaksanaan JVM khusus: HotSpot JVM. Kami juga boleh menggunakan istilah JVM dan HotSpot JVM secara bergantian.

2. Kebergantungan

Untuk memeriksa susun atur memori array 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. Panjang Array

HotSpot JVM menggunakan struktur data yang disebut Ordinary Object Pointers (OOP) untuk mewakili pointer ke objek. Untuk lebih spesifik, HotSpot JVM mewakili tatasusunan dengan OOP khas yang disebut arrayOop . Setiap arrayOop merangkumi tajuk objek dengan perincian berikut:

  • Kata satu tanda untuk menyimpan kod hash identiti atau maklumat GC
  • Satu perkataan klass untuk menyimpan metadata kelas umum
  • 4 bait mewakili panjang array

Oleh itu, JVM menyimpan panjang array dalam tajuk objek .

Mari kita sahkan ini dengan memeriksa susun atur memori array:

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

Seperti yang ditunjukkan di atas, kami menguraikan susun atur memori dari contoh array yang ada. Inilah cara JVM menyusun 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 disebutkan sebelumnya, JVM menyimpan panjang larik di dalam tajuk objek selepas tanda dan kata klass. Panjang array juga akan disimpan dalam 4 bait, jadi tidak boleh lebih besar daripada nilai maksimum untuk bilangan bulat 32-bit.

Selepas pengepala objek, JVM menyimpan elemen susunan sebenar. Oleh kerana kita mempunyai susunan 42 bilangan bulat, ukuran keseluruhan array adalah 168 bait - 42 dikalikan dengan 4.

4. Kesimpulan

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

Seperti biasa, semua contoh boleh didapati di GitHub.