Contoh dalam artikel ini menjelaskan cara menghitung (atau memperkirakan) jumlah memori yang ditempati oleh objek Java. Bagikan dengan semua orang untuk referensi Anda. Analisis spesifiknya adalah sebagai berikut:
Biasanya, kita berbicara tentang penggunaan memori heap dalam konteks "kasus umum". Dua situasi berikut tidak termasuk:
Dalam beberapa kasus, JVM tidak memasukkan Objek ke dalam heap sama sekali. Misalnya: Pada prinsipnya, objek lokal thread kecil ada di tumpukan, bukan di tumpukan.
Jumlah memori yang ditempati oleh suatu Objek bergantung pada keadaan Objek saat ini. Misalnya: apakah kunci sinkronisasi Objek sedang aktif, atau apakah Objek sedang didaur ulang.
Pertama-tama mari kita lihat seperti apa sebuah Object di heap.
Di heap, setiap objek terdiri dari empat bidang (A, B, C dan D). Mari kita jelaskan masing-masing di bawah ini:
A: Header objek, yang menempati sangat sedikit byte dan mengungkapkan informasi tentang status Objek saat ini.
B: Ruang yang ditempati oleh bidang tipe dasar (bidang asli mengacu pada int, boolean, short, dll.)
C: Ruang yang ditempati oleh bidang tipe referensi (bidang tipe referensi mengacu pada referensi ke objek lain, setiap referensi menempati 4 byte)
D : Ruang yang ditempati oleh filler (akan dijelaskan apa itu filler nanti)
Di bawah ini kami jelaskan A, B, C dan D satu per satu
A: Tajuk objek
Di memori, total ruang yang ditempati oleh setiap objek tidak hanya mencakup ruang yang diperlukan untuk variabel yang dideklarasikan dalam objek, tetapi juga mencakup beberapa informasi tambahan, seperti header dan pengisi objek. Fungsi "header objek" adalah untuk mencatat nama instance, ID, dan status instance suatu objek (misalnya, apakah instance saat ini "dapat dijangkau", atau status kunci saat ini, dll.).
Pada versi JVM (Hotspot) saat ini, jumlah byte yang ditempati oleh "header objek" adalah sebagai berikut:
Objek biasa, menempati 8 byte
Array, menempati 12 byte, termasuk 8 byte + 4 byte objek biasa (panjang array)
B: tipe dasar
boolean dan byte menempati 1 byte, char dan short menempati 2 byte, int dan float menempati 4 byte, long dan double menempati 8 byte
C: tipe referensi
Setiap tipe referensi menempati 4 byte
D: pengisi
Di Hotspot, total ruang yang ditempati oleh setiap objek dihitung sebagai kelipatan 8. Jika total ruang yang ditempati oleh objek (header objek + variabel yang dideklarasikan) kurang dari kelipatan 8, maka ruang tersebut akan terisi secara otomatis. Namun, ruang yang terisi ini bisa disebut "pengisi". Mari kita lihat contoh spesifiknya:
Objek kosong (tanpa variabel apa pun yang dideklarasikan) menempati 8 byte --> header objek menempati 8 byte
Kelas yang mendeklarasikan hanya satu variabel tipe boolean membutuhkan 16 byte --> header objek (8 byte) + boolean (1 byte) + pengisi (7 byte)
Kelas yang mendeklarasikan 8 variabel tipe boolean membutuhkan 16 byte --> header objek (8 byte) + boolean (1 byte) * 8
Contoh di atas akan membantu kita memperdalam pemahaman kita tentang pemrograman Java.