JavaRush /Java blogi /Random-UZ /Ob'ektning hayot aylanishi

Ob'ektning hayot aylanishi

Guruhda nashr etilgan
Salom! O'ylaymanki, kompyuteringizdagi xotira hajmi cheklanganligini aytsak, hayron bo'lmaysiz :) Operativ xotiradan bir necha baravar katta bo'lgan qattiq diskni ham sevimli o'yinlaringiz, teleseriallaringiz bilan to'ldirishingiz mumkin. va hokazo. Buning oldini olish uchun siz xotiraning joriy holatini kuzatib borishingiz va kompyuteringizdan keraksiz fayllarni o'chirishingiz kerak. Java dasturlashning bularning barchasiga qanday aloqasi bor? To'g'ridan-to'g'ri! Zero, Java mashinasi tomonidan istalgan ob'ekt yaratilganda unga xotira ajratiladi. Haqiqiy katta dasturda o'nlab va yuz minglab ob'ektlar yaratiladi, ularning har biri o'ziga xos xotira bo'lagiga ega. Ob'ektning hayot aylanishi - 1Ammo bu ob'ektlarning barchasi qancha vaqt mavjud deb o'ylaysiz? Ular bizning dasturimiz ishlayotgan vaqt davomida "yashaydimi"? Albatta yo'q. Java ob'yektlarining barcha afzalliklari bilan ular o'lmas emas :) Ob'ektlarning o'z hayot aylanishi mavjud. Bugun biz kod yozishda biroz tanaffus qilamiz va ushbu jarayonni ko'rib chiqamiz :) Bundan tashqari, bu dasturning ishlashini tushunish va resurslarni boshqarish uchun juda muhimdir. Xo'sh, ob'ektning hayoti qaerdan boshlanadi? Inson kabi - uning tug'ilishidan, ya'ni yaratilishidan.
Cat cat = new Cat();//вот сейчас и начался vital цикл нашего an object Cat!
Birinchidan, Java virtual mashinasi ob'ektni yaratish uchun kerakli hajmdagi xotirani ajratadi. Keyin u unga havola yaratadi, bizning holatlarimizda - catuni kuzatib borish uchun. Shundan so'ng, barcha o'zgaruvchilar ishga tushiriladi, konstruktor chaqiriladi va mana, bizning yangi ob'ektimiz allaqachon o'z hayotini yashamoqda :) Ob'ektlarning ishlash muddati boshqacha, bu erda aniq raqamlar yo'q. Qanday bo'lmasin, u bir muncha vaqt dastur ichida yashaydi va o'z vazifalarini bajaradi. Aniqroq qilib aytadigan bo'lsak, ob'ektga havolalar mavjud ekan, u "tirik" hisoblanadi. Hech qanday havolalar qolmasa, ob'ekt "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;

   }

}
Usulda main()Lamborghini Diablo avtomobil ob'ekti ikkinchi qatorda allaqachon tirik bo'lishni to'xtatadi. Unga faqat bitta havola bor edi va endi bu havola tayinlandi null. Lamborghini Diablo haqida hech qanday havolalar qolmaganligi sababli, u "axlat" bo'lib qoladi. Havolani qayta tiklash 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 erda biz ikkinchi ob'ektni yaratdik, shundan so'ng biz ma'lumotnomani olib lamborghini, uni ushbu yangi ob'ektga tayinladik. Endi Lamborghini Gallardoob'ektga ishora qiluvchi ikkita havola mavjud, ammo Lamborghini Diabloob'ektga hech kim yo'q. Shuning uchun ob'ekt Diabloaxlatga aylanadi. Va ayni paytda axlat yig'uvchi yoki boshqacha qilib aytganda - Garbage Collector, GC deb nomlangan o'rnatilgan Java mexanizmi ishga tushadi.
Ob'ektning hayot aylanishi - 2
Axlat yig'uvchi - bu xotirani bo'shatish, ya'ni undan keraksiz narsalarni olib tashlash uchun javobgar bo'lgan ichki Java mexanizmi. Uni tasvirlash uchun robot changyutgich bilan rasmni tanlaganimiz bejiz emas. Axir, axlat yig'uvchi xuddi shunday ishlaydi: fonda u sizning dasturingiz bo'ylab "sayohat qiladi", axlatni yig'adi va shu bilan birga siz u bilan deyarli aloqa qilmaysiz. Uning vazifasi dasturda ishlatilmaydigan ob'ektlarni olib tashlashdir. Shunday qilib, u boshqa ob'ektlar uchun kompyuterdagi xotirani bo'shatadi. Ma'ruza boshida biz oddiy hayotda kompyuteringizning holatini kuzatishingiz va eski fayllarni o'chirib tashlashingiz kerakligini aytganimizni eslaysizmi? Shunday qilib, Java ob'ektlari bo'lsa, axlat yig'uvchi buni siz uchun qiladi. Garbage Collector dasturingiz ishlashi davomida ko'p marta ishga tushiriladi: uni maxsus chaqirish va buyruqlar berish shart emas, garchi bu texnik jihatdan mumkin. Keyinchalik biz bu haqda ko'proq gaplashamiz va uning ish jarayonini batafsilroq tahlil qilamiz. Axlat yig'uvchi ob'ektga etib kelganida, uni yo'q qilishdan oldin, ob'ektga maxsus usul chaqiriladi - finalize(). U ob'ekt foydalanayotgan ba'zi qo'shimcha resurslarni bo'shatish uchun ishlatilishi mumkin. Usul finalize()sinfga tegishli Object. Ya'ni, siz ilgari tanishgan , va bilan birga har qanday ob'ektda unga equals()ega hashCode(). toString()Uning boshqa usullardan farqi shundaki, u ... qanday qilib qo'yish kerak ... juda injiq. Ya'ni, ob'ektni yo'q qilishdan oldin har doim ham chaqirilmaydi. Dasturlash - bu aniq narsa. Dasturchi kompyuterga biror narsa qilishni buyuradi va kompyuter buni bajaradi. Ehtimol, siz allaqachon bu xatti-harakatga o'rganib qolgansiz va dastlab siz uchun bu fikrni qabul qilish qiyin bo'lishi mumkin: “Ob'ektlar yo'q qilinishidan oldin sinf finalize()usuli Object. Yoki chaqirilmaydi. Nasib qilsa!" Biroq, bu haqiqat. finalize()Java mashinasi har bir alohida holatda usulni chaqirish yoki chaqirmaslikni o'zi belgilaydi . Misol uchun, tajriba uchun quyidagi kodni ishga tushirishga harakat qilaylik:
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;//вот здесь первый an object становится доступен сборщику мусора
       }
   }

   @Override
   protected void finalize() throws Throwable {
       System.out.println("Объект Cat уничтожен!");
   }
}
Biz ob'ektni yaratamiz Catva kodning keyingi qatorida unga yagona havolani tiklaymiz. Va shunday - million marta. Biz usulni aniq bekor qildik finalize()va u har safar ob'ektni yo'q qilishdan oldin satrni konsolga million marta bosib chiqarishi kerak Cat. Lekin yoq! Aniqroq aytganda, u mening kompyuterimda atigi 37 346 marta ishlagan! Ya'ni, 27 ta holatdan faqat 1 tasida men o'rnatgan Java mashinasi usulni chaqirishga qaror qildi finalize()- boshqa hollarda, axlat yig'ish busiz davom etdi. Ushbu kodni o'zingiz ishga tushirib ko'ring: katta ehtimol bilan, natija boshqacha bo'ladi. Ko'rib turganingizdek, finalize()uni ishonchli hamkor deb atash qiyin :) Shuning uchun, kelajak uchun kichik maslahat: finalize()ba'zi muhim resurslarni bo'shatishda usulga tayanmaslik kerak. Ehtimol, JVM uni chaqiradi, balki yo'q. Kim biladi? Agar sizning ob'ektingiz ishlash muddati davomida ishlash uchun juda muhim bo'lgan ba'zi resurslarni egallagan bo'lsa, masalan, u ma'lumotlar bazasiga ochiq ulanishni saqlagan bo'lsa, ularni bo'shatish uchun sinfingizda maxsus usulni yaratish va ob'ekt bo'lganda uni aniq chaqirish yaxshiroqdir. endi kerak emas. Shunday qilib, dasturingizning ishlashi zarar ko'rmasligini aniq bilib olasiz. Eng boshida biz xotirani boshqarish va axlatni olib tashlash juda muhim ekanligini aytdik va bu haqiqat. Resurslar bilan noto'g'ri ishlash va keraksiz ob'ektlarni yig'ish jarayonini tushunmaslik xotiraning oqishiga olib kelishi mumkin. Bu eng mashhur dasturlash xatolaridan biridir. Dasturchi tomonidan noto'g'ri yozilgan kod har safar yangi yaratilgan ob'ektlar uchun yangi xotira ajratilishiga olib kelishi mumkin, eski, keraksiz ob'ektlar esa axlat yig'uvchi tomonidan olib tashlanishi mumkin emas. Biz robot changyutgich bilan o'xshashlik qilganimiz uchun, robotni ishga tushirishdan oldin, siz uy atrofida paypoqlarni sochsangiz, shisha vazani sindirib, demontaj qilingan Lego to'plamini erga qo'ysangiz nima bo'lishini tasavvur qiling. Robot, albatta, biror narsa qilishga harakat qiladi, lekin bir vaqtning o'zida u tiqilib qoladi.
Ob'ektning hayot aylanishi - 3
Uning to'g'ri ishlashi uchun siz zaminni yaxshi holatda saqlashingiz va u erdan changyutgich ishlay olmaydigan narsalarni olib tashlashingiz kerak. Axlat yig'uvchi xuddi shu printsip asosida ishlaydi. Agar dasturda to'play olmaydigan juda ko'p narsalar qolsa (masalan, paypoq yoki robot changyutgich uchun Lego), bir vaqtning o'zida xotira tugaydi. Va nafaqat siz yozgan dastur, balki o'sha paytda kompyuterda ishlaydigan barcha boshqa dasturlar ham muzlaydi. Ular uchun ham xotira yetarli bo'lmaydi. Java-da ob'ektning hayot aylanishi va axlat yig'uvchisi shunday ko'rinadi. Buni eslab qolishning hojati yo'q: ish printsipini tushunish kifoya. Keyingi ma'ruzada bu jarayonlar haqida batafsilroq gaplashamiz, ammo hozircha JavaRush muammolarini hal qilishga qaytishingiz mumkin :) Omad tilaymiz!
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION