Memori di JVM

Level 18, Pelajaran 0
Tersedia

Memahami Memori di JVM

Seperti yang sudah Anda ketahui, JVM menjalankan program Java di dalamnya. Seperti mesin virtual lainnya, ia memiliki sistem organisasi memorinya sendiri.

Tata letak memori internal menunjukkan cara kerja aplikasi Java Anda. Dengan cara ini, kemacetan dalam pengoperasian aplikasi dan algoritma dapat diidentifikasi. Mari kita lihat cara kerjanya.

Memahami Memori di JVM

Penting! Model Java asli tidak cukup bagus, sehingga direvisi di Java 1.5. Versi ini digunakan hingga hari ini (Java 14+).

Tumpukan Benang

Model memori Java yang digunakan secara internal oleh JVM membagi memori menjadi tumpukan dan tumpukan utas. Mari kita lihat model memori Java, yang secara logis dibagi menjadi beberapa blok:

Tumpukan Benang

Semua utas yang berjalan di JVM memiliki tumpukannya sendiri . Tumpukan, pada gilirannya, menyimpan informasi tentang metode mana yang dipanggil utas. Saya akan menyebutnya "tumpukan panggilan". Tumpukan panggilan dilanjutkan segera setelah utas mengeksekusi kodenya.

Tumpukan utas berisi semua variabel lokal yang diperlukan untuk mengeksekusi metode pada tumpukan utas. Utas hanya dapat mengakses tumpukannya sendiri. Variabel lokal tidak terlihat oleh utas lain, hanya utas yang membuatnya. Dalam situasi di mana dua utas mengeksekusi kode yang sama, keduanya membuat variabel lokalnya sendiri. Dengan demikian, setiap utas memiliki versinya sendiri untuk setiap variabel lokal.

Semua variabel lokal dari tipe primitif ( boolean , byte , short , char , int , long , float , double ) disimpan seluruhnya di tumpukan utas dan tidak terlihat oleh utas lainnya. Satu utas dapat meneruskan salinan variabel primitif ke utas lain, tetapi tidak dapat berbagi variabel lokal primitif.

Tumpukan

Tumpukan berisi semua objek yang dibuat dalam aplikasi Anda, terlepas dari utas mana yang membuat objek tersebut. Ini termasuk pembungkus tipe primitif (misalnya, Byte , Integer , Long , dan seterusnya). Tidak masalah jika objek dibuat dan ditugaskan ke variabel lokal atau dibuat sebagai variabel anggota dari objek lain, itu disimpan di heap.

Di bawah ini adalah diagram yang mengilustrasikan tumpukan panggilan dan variabel lokal (mereka disimpan di tumpukan) serta objek (disimpan di tumpukan):

Tumpukan

Dalam kasus di mana variabel lokal adalah tipe primitif, itu disimpan di tumpukan utas.

Variabel lokal juga bisa menjadi referensi ke suatu objek. Dalam hal ini, referensi (variabel lokal) disimpan di tumpukan utas, tetapi objek itu sendiri disimpan di tumpukan.

Objek berisi metode, metode ini berisi variabel lokal. Variabel lokal ini juga disimpan di tumpukan utas, bahkan jika objek yang memiliki metode disimpan di tumpukan.

Variabel anggota objek disimpan di heap bersama dengan objek itu sendiri. Ini benar baik ketika variabel anggota bertipe primitif dan ketika itu adalah referensi objek.

Variabel kelas statis juga disimpan di heap bersama dengan definisi kelas.

Interaksi dengan objek

Objek di heap dapat diakses oleh semua utas yang memiliki referensi ke objek tersebut. Jika utas memiliki akses ke objek, maka utas dapat mengakses variabel objek. Jika dua utas memanggil metode pada objek yang sama pada saat yang sama, keduanya akan memiliki akses ke variabel anggota objek, tetapi setiap utas akan memiliki salinan variabel lokalnya sendiri.

Interaksi dengan objek (tumpukan)

Dua utas memiliki satu set variabel lokal.Variabel Lokal 2menunjuk ke objek bersama di heap (Objek 3). Setiap utas memiliki salinan variabel lokalnya sendiri dengan referensinya sendiri. Referensi mereka adalah variabel lokal dan karenanya disimpan di tumpukan utas. Namun, dua referensi berbeda menunjuk ke objek yang sama di heap.

Harap dicatat bahwa umumObjek 3memiliki tautan keObjek 2DanObjek 4sebagai variabel anggota (ditunjukkan oleh panah). Melalui tautan ini, dua utas dapat mengaksesObjek 2DanObyek4.

Diagram juga menunjukkan variabel lokal (variabel lokal 1dari methodTwo ). Setiap salinan berisi referensi berbeda yang menunjuk ke dua objek berbeda (Objek 1DanObjek 5) dan tidak sama. Secara teoritis, kedua utas dapat mengakses keduanyaObjek 1, jadi untukObjek 5jika mereka memiliki referensi ke kedua objek ini. Namun pada diagram di atas, setiap utas hanya memiliki referensi ke salah satu dari dua objek tersebut.

Contoh interaksi dengan objek

Mari kita lihat bagaimana kita dapat mendemonstrasikan pekerjaan dalam kode:

public class MySomeRunnable implements Runnable() {

    public void run() {
        one();
    }

    public void one() {
        int localOne = 1;

        Shared localTwo = Shared.instance;

        //... do something with local variables

        two();
    }

    public void two() {
        Integer localOne = 2;

        //... do something with local variables
    }
}
public class Shared {

    // store an instance of our object in a variable

    public static final Shared instance = new Shared();

    // member variables pointing to two objects on the heap

    public Integer object2 = new Integer(22);
    public Integer object4 = new Integer(44);
}

Metode run() memanggil metode one() , dan one() pada gilirannya memanggil two() .

Metode one() mendeklarasikan variabel lokal primitif (localOne) bertipe int dan variabel lokal (localTwo), yang merupakan referensi ke objek.

Setiap utas yang menjalankan metode one() akan membuat salinannya sendirilocalOneDanlocalTwodi tumpukan Anda. VariabellocalOneakan benar-benar terpisah satu sama lain, berada di tumpukan setiap utas. Satu utas tidak dapat melihat perubahan apa yang dibuat utas lain pada salinannyalocalOne.

Setiap utas yang menjalankan metode one() juga membuat salinannya sendirilocalTwo. Namun, dua salinan berbedalocalTwoakhirnya menunjuk ke objek yang sama di heap. Faktanya adalah itulocalTwomenunjuk ke objek yang direferensikan oleh variabel statiscontoh. Hanya ada satu salinan variabel statis, dan salinan itu disimpan di heap.

Jadi sama-sama salinanlocalTwoakhirnya menunjuk ke instance Shared yang sama . Instance Shared juga disimpan di heap. Itu cocokObjek 3dalam diagram di atas.

Perhatikan bahwa Shared class juga berisi dua variabel anggota. Variabel anggota itu sendiri disimpan di heap bersama dengan objeknya. Dua variabel anggota menunjuk ke dua objek lainnyaBilangan bulat. Objek bilangan bulat ini sesuai denganObjek 2DanObjek 4pada diagram.

Perhatikan juga bahwa metode two() membuat variabel lokal bernamalocalOne. Variabel lokal ini adalah referensi ke objek bertipe Integer . Metode menetapkan tautanlocalOneuntuk menunjuk ke instance Integer baru . Tautan akan disimpan dalam salinannyalocalOneuntuk setiap utas. Dua instance Integer akan disimpan di heap, dan karena metode membuat objek Integer baru setiap kali dieksekusi, dua utas yang mengeksekusi metode ini akan membuat instance Integer terpisah . Mereka cocokObjek 1DanObjek 5dalam diagram di atas.

Perhatikan juga dua variabel anggota dalam kelas Shared bertipe Integer , yang merupakan tipe primitif. Karena variabel-variabel ini adalah variabel anggota, mereka masih disimpan di heap bersama dengan objeknya. Hanya variabel lokal yang disimpan di tumpukan utas.

Komentar
  • Populer
  • Baru
  • Lama
Anda harus login untuk memberikan komentar
Halaman ini belum memiliki komentar