Pangerten Memori ing JVM

Kaya sing wis dingerteni, JVM mbukak program Java ing awake dhewe. Kaya mesin virtual, nduweni sistem organisasi memori dhewe.

Tata letak memori internal nuduhake cara kerja aplikasi Java. Kanthi cara iki, bottlenecks ing operasi aplikasi lan algoritma bisa diidentifikasi. Ayo ndeleng cara kerjane.

Pangerten Memori ing JVM

Penting! Model Jawa asline kurang apik, mula direvisi ing Jawa 1.5. Versi iki digunakake nganti saiki (Jawa 14+).

Tumpukan Utas

Model memori Jawa sing digunakake sacara internal dening JVM mbagi memori dadi tumpukan benang lan tumpukan. Ayo ndeleng model memori Jawa, kanthi logis dipérang dadi blok:

Tumpukan Utas

Kabeh utas sing mlaku ing JVM duwe tumpukan dhewe . Tumpukan kasebut uga ngemot informasi babagan metode apa sing diarani benang. Aku bakal nelpon iki "tumpukan telpon". Tumpukan telpon diterusake sanalika thread nglakokake kode kasebut.

Tumpukan utas ngemot kabeh variabel lokal sing dibutuhake kanggo nglakokake metode ing tumpukan utas. Utas mung bisa ngakses tumpukan dhewe. Variabel lokal ora katon ing thread liyane, mung kanggo thread sing nggawe. Ing kahanan ing ngendi loro utas nindakake kode sing padha, loro-lorone nggawe variabel lokal dhewe. Mangkono, saben thread duwe versi dhewe saka saben variabel lokal.

Kabeh variabel lokal saka jinis primitif ( boolean , byte , short , char , int , long , float , double ) disimpen kabeh ing tumpukan benang lan ora katon ing benang liyane. Siji thread bisa ngirim salinan variabel primitif menyang thread liyane, nanging ora bisa nuduhake variabel lokal primitif.

numpuk

Tumpukan kasebut ngemot kabeh obyek sing digawe ing aplikasi sampeyan, preduli saka benang sing nggawe obyek kasebut. Iki kalebu bungkus saka jinis primitif (contone, Byte , Integer , Long , lan liya-liyane). Ora Matter yen obyek digawe lan diutus kanggo variabel lokal utawa digawe minangka variabel anggota saka obyek liyane, iku disimpen ing numpuk.

Ing ngisor iki diagram sing nggambarake tumpukan telpon lan variabel lokal (simpen ing tumpukan) uga obyek (sing disimpen ing tumpukan):

numpuk

Ing kasus endi variabel lokal saka jinis primitif, disimpen ing tumpukan thread.

Variabel lokal uga bisa dadi referensi kanggo obyek. Ing kasus iki, referensi (variabel lokal) disimpen ing tumpukan benang, nanging obyek kasebut disimpen ing tumpukan kasebut.

Objek ngemot metode, metode kasebut ngemot variabel lokal. Variabel lokal iki uga disimpen ing tumpukan benang, sanajan obyek sing duwe metode kasebut disimpen ing tumpukan.

Variabel anggota obyek disimpen ing tumpukan bebarengan karo obyek kasebut. Iki bener nalika variabel anggota saka jinis primitif lan nalika minangka referensi obyek.

Variabel kelas statis uga disimpen ing tumpukan bebarengan karo definisi kelas.

Interaksi karo obyek

Obyek ing tumpukan bisa diakses dening kabeh thread sing duwe referensi kanggo obyek. Yen thread nduweni akses menyang obyek, banjur bisa ngakses variabel obyek. Yen loro thread nelpon cara ing obyek sing padha ing wektu sing padha, loro-lorone bakal duwe akses menyang variabel anggota obyek, nanging saben thread bakal duwe salinan dhewe saka variabel lokal.

Interaksi karo obyek (tumpukan)

Rong thread duwe set variabel lokal.2. Variabel Lokalnuding obyek sing dienggo bareng ing tumpukan (Objek 3). Saben utas duwe salinan variabel lokal kanthi referensi dhewe. Referensi kasebut minangka variabel lokal lan mulane disimpen ing tumpukan benang. Nanging, rong referensi sing beda nuduhake obyek sing padha ing tumpukan kasebut.

Wigati dimangerteni yen umumObjek 3wis pranala menyangObjek 2lanObjek 4minangka variabel anggota (dituduhake kanthi panah). Liwat tautan kasebut, rong utas bisa diaksesObjek 2lanobyek4.

Diagram uga nuduhake variabel lokal (variabel lokal 1saka metode Loro ). Saben salinan ngemot referensi beda sing nuduhake rong obyek sing beda (Objek 1lanObjek 5) lan ora padha. Secara teoritis, loro thread bisa ngakses loro-loroneObjek 1, supayaObjek 5yen padha duwe referensi kanggo loro obyek iki. Nanging ing diagram ing ndhuwur, saben utas mung nduweni referensi kanggo salah siji saka rong obyek kasebut.

Conto interaksi karo obyek

Ayo ndeleng carane kita bisa nduduhake karya ing 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);
}

Run () cara nelpon siji () cara , lan siji () ing siji nelpon loro () .

Metode one() menyatakan variabel lokal primitif (lokalOne) saka tipe int lan variabel lokal (lokalTwo), sing minangka referensi kanggo obyek.

Saben thread nglakokake metode siji () bakal nggawe salinan dhewelokalOnelanlokalTwoing tumpukan Panjenengan. VariabellokalOnebakal rampung kapisah saka saben liyane, kang ing tumpukan saben thread. Siji thread ora bisa ndeleng apa owah-owahan thread liyane kanggo salinan sawijininglokalOne.

Saben Utas nglakokaké siji () cara uga nggawe salinan dhewelokalTwo. Nanging, rong salinan bedalokalTwopungkasane nuding obyek sing padha ing tumpukan. Kasunyatan ikulokalTwonunjukake obyek sing dirujuk dening variabel statiscontone. Mung ana siji salinan variabel statis, lan salinan kasebut disimpen ing tumpukan.

Dadi loro salinanlokalTwomungkasi munggah pointing kanggo Kayata Shared padha . Instance Shared uga disimpen ing heap. Iku cocogObjek 3ing diagram ndhuwur.

Elinga yen kelas Shared uga ngemot rong variabel anggota. Variabel anggota dhewe disimpen ing tumpukan bebarengan karo obyek kasebut. Rong variabel anggota nuduhake rong obyek liyaneOngko. Obyek integer iki cocog karoObjek 2lanObjek 4ing diagram.

Elinga uga yen metode loro () nggawe variabel lokal jenengelokalOne. Variabel lokal iki minangka referensi kanggo obyek saka tipe Integer . Cara nyetel linklokalOnekanggo nuding menyang integer Integer anyar . Link bakal disimpen ing salinanlokalOnekanggo saben thread. Loro Integer Integer bakal disimpen ing heap, lan amarga metode kasebut nggawe obyek Integer anyar saben dieksekusi, loro thread sing nglakokake metode iki bakal nggawe integer Integer sing kapisah . Padha cocogObjek 1lanObjek 5ing diagram ndhuwur.

Wigati uga rong variabel anggota ing kelas Shared saka jinis Integer , yaiku jinis primitif. Amarga variabel kasebut minangka variabel anggota, dheweke isih disimpen ing tumpukan bebarengan karo obyek kasebut. Mung variabel lokal sing disimpen ing tumpukan thread.