JavaRush /Kurslar /All lectures for UZ purposes /Obyektning Hayotiy Tsikli

Obyektning Hayotiy Tsikli

All lectures for UZ purposes
Daraja, Dars
Mavjud
Salom! Obyektning Hayotiy Tsikli - 1O'ylaymanki, agar sizga kompyuteringizdagi xotira hajmi cheklanganligini aytsam, siz unchalik hayron qolmaysiz:) Hatto operativ xotiradan bir necha marta katta bo'lgan qattiq disk ham sevimli o'yinlar, seriallar va boshqalar bilan to'ldirilishi mumkin. Buning oldini olish uchun, xotiraning hozirgi holatini kuzatib borish va keraksiz fayllarni kompyuterdan o'chirish kerak. Bunga Java dasturlash tilining nima aloqasi bor? To'g'ridan-to'g'ri! Chunki har qanday ob'ekt yaratilganda, Java Virtual Mashinasi unga xotira ajratadi. Katta dasturda o'nlab va hatto yuzlab mingta obyekt yaratiladi, va ulardan har biri uchun xotiradan ma'lum bir joy ajratiladi. Lekin, o'ylab ko'raylik, bu obyektlar qancha vaqt mavjud bo'lishadi? Ular dastur ishlayotgan vaqt davomida doimo "yashayaptimi"? Albatta, yo'q. Java obyektlarining barcha afzalliklariga qaramay, ular abadiy emas :) Obyektlarning o‘zlarining hayotiy tsikllari mavjud. Bugun biz bir oz kod yozishdan dam olamiz va bu jarayonni ko'rib chiqamiz :) Bu dastur ishini va resurslarni boshqarishni tushunish uchun juda muhim. Xo'sh, obyektning hayoti nimadan boshlanadi? Inson kabi - tug'ilishidan, ya'ni yaratilishidan.

Cat cat = new Cat();//mana shu yerda bizning Cat obyekti hayot tsikli boshlandi!
Avvaliga Java Virtual Mashinasi obyektni yaratish uchun kerakli hajmdagi xotirani ajratadi. Keyin u unga havola (reference) yaratadi, bizning holatda - cat, uni kuzatish imkoniyatiga ega bo'lish uchun. Shundan so'ng barcha o'zgaruvchilarni ishga tushirish, konstruktorni chaqirish sodir bo'ladi va mana - bizning yangi obyektimiz o'z hayotini boshlaydi :) Obyektlarning turli hayot muddati bor, bu erda aniq raqamlar yo'q. Har qanday holatda, u dastur ichida yashab, o'z funktsiyalarini bajaradi. Agar aniq aytadigan bo'lsak, obyekt "tirik" bo'ladi, u holda unga havolalar mavjud. Havolalar tugagach, obyekt "o'ladi". Masalan:

public class Car {
  
   String model;

   public Car(String model) {
       this.model = model;
   }

   public static void main(String[] args) {
       Car lamborghini  = new Car("Lamborghini Diablo");
       lamborghini = null;

   }

}
main() metodida Lamborghini Diablo mashina obyekti ikkinchi qatorda yashashni to'xtatadi. Unga faqat bitta havola bor edi, endi esa bu havolaga null berildi. Lamborghini Diabloga hech qanday havola qolmagandan so'ng, u "axlat"ga aylanadi. Havolani qat'iyan tozalash shart emas:

public class Car {

   String model;

   public Car(String model) {
       this.model = model;
   }

   public static void main(String[] args) {
       Car lamborghini  = new Car("Lamborghini Diablo");

       Car lamborghiniGallardo = new Car("Lamborghini Gallardo");
       lamborghini = lamborghiniGallardo;
   }

}
Bu yerda biz ikkinchi obyektni yaratdik, so'ngra lamborghini havolasini olib, unga yangi obyektni berdik. Endi Lamborghini Gallardo obyektiviga ikki marta havola bor, namun Lamborghini Diablo obyektiviga hech qanday havola yo'q. Shuning uchun Diablo obyektiv axlatga aylanadi. Va ayni paytda Java'dagi qabul qilingan axlat yig'uvchi, yoki boshqacha qilib aytganda – Garbage Collector, GC ishlay boshlaydi.
Obyektning Hayotiy Tsikli - 2
Garbage Collector Java'ning ichki mexanizmi bo'lib, u xotirani bo'shatish, ya'ni kerak bo'lmagan obyektlarni undan olib tashlash uchun javobgardir. Biz uning tasviri uchun robot changyutgichini bejiz tanlamadik. Axlat yig'uvchi xuddi shunday ishlaydi: u orqa fonda sizning dasturingiz ustida "yuradi" va axlatni yig'adi, va siz deyarli hech qaysi paytda u bilan o'zaro aloqada bo'lmaysiz. Uning vazifasi dasturda foydalanilmayotgan obyektlarni olib tashlashdir. Shu tarzda u kompyuterda boshqa obyektlar uchun xotira bo'shatadi. Ma'ruzada aytganimizdek, oddiy hayotda siz kompyuteringizning holatini kuzatib borishingiz va eski fayllarni o'chirishingiz kerakmi edi? Mana, Java obyektlarida axlat yig'uvchi bu ishlarda siz uchun ishlab chiqadi. Garbage Collector sizning dasturingiz ishlashi davomida ko'p marta ishga tushadi: uni maxsus chaqirish va buyruqlar berish shart emas, garchi texnik jihatdan bu mumkin bo'lsa-da. Keyinroq biz bu haqida yana gaplashamiz va uning ishlash jarayonini yanada batafsilroq o'rganamiz. Garbage Collector obyektga yetib kelgan paytda, uning yo'q qilinishidan oldin, obyektga maxsus finalize() metodi chaqiriladi. Uni obyekt foydalangan qo‘shimcha resurslarni bo‘shatish uchun ishlatish mumkin. finalize() metodi Object klassiga tegishli. Ya'ni, equals(), hashCode() va toString() bilan bir qatorda, u har qanday obyektga tegishli. Boshqa metodlardan farqi shundaki, u... qanday aytish kerak... juda o'ziga xos. Ya'ni - obyektning yo'q qilinishi oldidan u har doim ham chaqirilmaydi. Dasturlash – aniq narsa. Dasturchi kompyuterga biror narsa qilishni aytadi - kompyuter buni qiladi. Siz, ehtimol, bunday xulq-atvorni allaqachon o'rgandingiz va dastlab sizga qiyin bo'lishi mumkin: “Obyektlar yo'q qilinishidan oldin Object klassining finalize() metodi chaqiriladi. Yoki chaqirilmaydi. Omadli bo'lsa!" Bunday bo'lsa ham, bu haqiqat. Java-mashina har safar finalize() metodini chaqirish yoki chaqirmaslikka o'zi qaror qiladi. Masalan, biz bunday kodni ishga tushirishni tajribasida ko'raylik:

public class Cat {

   private String name;

   public Cat(String name) {
       this.name = name;
   }

   public Cat() {
   }

   public static void main(String[] args) throws Throwable {
       for (int i = 0 ; i < 1000000; i++) {
           Cat cat = new Cat();
           cat = null;//mana shu yerda birinchi obyekt musor yig'uvchiga yetib boradi
       }
   }

   @Override
   protected void finalize() throws Throwable {
       System.out.println("Obyekt Cat yo'q qilindi!");
   }
}
Biz Cat obyektini yaratamiz va keyingi qatorda unga yagona havolani nolga aylantiramiz. Va shu tarzda million marta. Biz aniq finalize() metodini qayta yozdik va u obyekt Cat yo'q qilinishidan oldin konsolga million marta satrni chiqarishi kerak edi. Lekin yo'q! Agar aniq bo'lsam, mening kompyuterimda u faqat 37346 marta ishladi! Ya'ni, faqat 27-tadan 1 holatda menda mavjud bo'lgan Java-mashina finalize() metodini chaqirishga qaror qildi - qolgan hollarda axlat yig'ish bu holda o'tdi. Bu kodni o'zingizda ishga tushirishga harakat qiling: ehtimol, natija boshqacha bo'ladi. Ko'rib turganingizdek, finalize() ishonchli hamkor deyilishi qiyin :) Shuning uchun kelajak uchun kichik maslahat: agar muhim resurslarni bo'shatish kerak bo'lsa, finalize() metodiga ishonmaslik kerak. Balki JVM uni chaqiradi, balki yo'q. Kim biladi? Agar sizning obyektingiz umr davomida juda muhim resurslarni egallagan bo'lsa, masalan, ma'lumotlar bazasi bilan ochiq aloqani saqlagan bo'lsa, o'zingizning sinfingizda ularni bo'shatish uchun maxsus metod yarating va obyekt kerak bo'lmaganda uni aniq chaqiring. Shu tarzda siz dasturingizning ishlashiga zarar yetilmasligiga amin bo'lasiz. Biz boshida aytdik, xotira bilan ishlash va axlatni olib tashlash juda muhim, va bu haqiqat. Resurslar bilan noto'g'ri ishlash va keraksiz obyektlarni yig'ish jarayonini tushunmaslik xotira oqishiga olib kelishi mumkin. Bu dasturlashdagi eng mashhur xatolardan biri. Noto'g'ri yozilgan kod yangi yaratilgan obyektlar uchun har doim yangi xotira ajratilishiga olib kelishi mumkin, shunda eski, keraksiz obyektlar axlat yig'uvchi tomonidan olib tashlanishga nol qoladi. Biz robot changyutgichni misol keltirdik, agar robotni ishga tushirishdan oldin uyda paypoqlarni sochib tashlasangiz, shisha vazani sindirib qo'ysangiz va Lego konstruktori yig'ilmasa nima bo'lishini tasavvur qiling. Robot, albatta, nimadir qilishga harakat qiladi, lekin bir ajoyib paytda u tiqilib qoladi.
Obyektning Hayotiy Tsikli - 3
Robotning to'g'ri ishlashi uchun polni toza saqlash va changyutgich bilan ishlamaydigan narsalarni olib tashlash kerak. Axlat yig'uvchi ham xuddi shunday ishlaydi. Agar dasturda yig'ilishi mumkin bo'lmagan ko'p obyektlar qoldirilsa, bir ajoyib paytda xotira tugaydi. Va sizning dasturingiz emas, balki kompyuterda ishga tushirilgan boshqa dasturlar ham muammo bo'lishi mumkin. Ular uchun xotira yetarli bo'lmasligi mumkin.

Buni o'rganish shart emas: ishlash prinsipini tushunish kifoya.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION