TGTGInsighttelegram-intelligenzLIVE / telegram public index
← IT suhbat
IT suhbat avatar

TGINSIGHT POST

Post #148

@it_suhbat

IT suhbat

Ansichten1,020Anzahl der Ansichten
Gepostet25. Dez.25.12.2021, 02:50
Beitragsinhalt

Inhalt

Javada xotira bilan ishlash to'liq avtomatlashgan. Biz uni nazorat qilishimiz shart emas. Lekin, xotira aslida qanday ishlashligi haqida tushunchaga ega bo'lsak, yozayotgan kodimizda qanaqa jarayonlar kechayotganini to'liqroq tushunamiz, xotira bilan bog'liq muammolar yuzaga kelgan paytda ongli ravishda yechim qilishga erishamiz, in shaa Alloh. Yozilgan kodni ishga tushirishning bir qancha bosqichlari bor: - .java kengaytmali source kodimiz javac orqali kompilyatsiya qilinib, .class kengaytmali bytecode ga o'giriladi. - hosil bo'lgan bytecode'lar classloader, bytecode verifier va yana shu kabi bosqichlardan o'tadi(hozir mavzu xotira bo'lgani uchun bularni har biriga to'xtalmadim) - tayyor bo'lgan bytecode interpretatsiya uchun uzatiladi Dastur ishga tushganidan keyin xotirada nimalar yuz beradi? JVM bir necha turdagi xotira maydonlarini hosil qiladi, bular dastur ishlashi davomida foydalaniladi. JVM ishini to'xtatsa, xotiralar uchun ajratilgan joy ham bekor qilinadi. Xotira maydonlari qaysilar: 1. Method area Metod maydoni Heapning bir qismi bo'lib, hamma oqimlar uchun yagona hisoblanadi. U JVM ishga tushgan payti hosil qilinadi. Bu xotira maydoni class'lar, superclass nomlari, interfeyslar nomlari va konstruktorlarni saqlash uchun ishlatiladi. Umumiy qilib aytganda, metod maydoni o'zida quyidagilarni saqlaydi: - Ma'lumot turlarining to'liq nomlari, misol uchun String; - Ma'lumot turlari modifikatorlarini; - Voris olingan class nomlarini; - Voris olingan interfeyslarning to'liq shakllangan ro'yxatini. 2. Heap area Heap foydalanib turilayotgan obyektlarni o'zida saqlaydi. U ham JVM ishga tushgan payti hosil qilinadi. Heap uchun ajratilish kerak bo'lgan joyni biz o'zimiz belgilab qo'yish huquqimiz bor(Bu haqida ham in shaa Alloh keyinchalik to'xtalamiz). Qachon biz new kalit so'zidan foydalanib, biror obyekt yaratsak, misol uchun int [] arr = new int[10]; xuddi shu ma'lumot uchun heapdan joy ajratiladi, ya'ni obyekt. arr o'zgaruvchi nomi esa stack da saqlanadi va ular bir biriga bog'lanadi. JVM da faqatgina bitta heap maydon bo'ladi xolos va hamma obyektlar shu yerda saqlanadi. Qachonki, heapdagi ma'lumot stack'dagi o'zgaruvchi nomi bilan bo'lgan aloqani uzsa, garbage collector bu obyektni "musor" deb hisoblaydi va o'chirib tashlaydi. Heap maydoni to'lib qolsa, dastur ishlashdan to'xtaydi :) Heap bir necha qismlarga bo'linadi: - Young generation - Survivor space - Old generation - Permanent generation - Code Cache (Bular haqida ham keyinchalik to'xtalamiz) 3. Stack Stack nomli to'plam mavjud. U LIFO(Last Input - First Output) prinspida ishlaydi. Stack oqim(thread) ochilganidan keyin hosil qilinadi. Bu ham fixed yoki dinamik o'lchamda bo'lishi mumkin. Stack o'zida primitive tip ma'lumotlarini(5, 'w', true, 1.5...) va Heapdagi obyekt uchun reference saqlaydi. Stacklarda stack frame tushunchasi mavjud. Bu yerda oqim ma'lumotlari saqlanadi. Tushunarliroq qilib aytganda, biror metodni chaqirgan paytimizda u uchun alohida stack ochiladi, ya'ni bu metod ichida oldingi o'zgaruvchilar ko'rinmaydi, oldingilari boshqa stackda, hozirgisi boshqada. O'z navbatida, metoddagi ishlar amalga oshirilganidan keyin bu stack va undagi ma'lumotlar o'chib ketadi. Har bir stackda Local Variable Array(LVA), Operand Stack(OS) va Frame Data(FD) mavjud bo'ladi. 4. PC Register Har bir oqim Program Counter(PC) bilan bog'lanadi. PC register JVM dagi eng kichik maydon. Unda hozir ishlab turgan bytecode qatori indikatorining raqami saqlanadi. Bytecode interpreter ushbu counterning qiymatini o'zgartirib, ya'ni keyingi qatordagi kodni amalga oshirib ishlaydi. Keyingi qatordagi bytecode'ni o'qib olish uchun counterning keyingi qiymatini oladi. Hozircha shu ma'lumotlar, in shaa Alloh hammamizni ilmimizni ziyoda qilsin, @it_suhbat da gaplashamiz yana :)