JavaRush /Java блогы /Random-KK /Объектінің өмірлік циклі

Объектінің өмірлік циклі

Топта жарияланған
Сәлеметсіз бе! Компьютеріңіздегі жад көлемі шектеулі екенін айтсақ, таң қалмайсыз деп ойлаймын :) Тіпті оперативті жадтан бірнеше есе үлкен қатты дискіні сүйікті ойындарыңызбен, телехикаяларыңызбен, және тағы басқа. Бұған жол бермеу үшін жадтың ағымдағы күйін бақылап, компьютерден қажет емес файлдарды жою керек. Мұның бәріне Java бағдарламалауының қандай қатысы бар? Тікелей! Өйткені кез келген an object Java машинасымен жасалғанда, оған жад бөлінеді. Нағыз үлкен бағдарламада ондаған және жүздеген мың нысандар жасалады, олардың әрқайсысында жеке жады бөлінген. Объектінің өмірлік циклі - 1Бірақ бұл нысандардың барлығы қанша уақыт бар деп ойлайсыз? Олар біздің бағдарлама жұмыс істеп тұрған уақыт бойы «өмір сүреді» ме? Әрине жоқ. Java нысандарының барлық артықшылықтарымен олар өлмейтін емес :) Нысандардың өз өмірлік циклі бар. Бүгін біз code жазудан аздап үзіліс жасап, осы процесті қарастырамыз :) Сонымен қатар, бұл бағдарламаның жұмысын түсіну және ресурстарды басқару үшін өте маңызды. Сонымен, an objectінің өмірі неден басталады? Адам сияқты – туғаннан, яғни жаратылғаннан.
Cat cat = new Cat();//вот сейчас и начался vital цикл нашего an object Cat!
Біріншіден, Java виртуалды машинасы an objectіні жасау үшін қажетті жад көлемін бөледі. Содан кейін ол оған сілтеме жасайды, біздің жағдайда - catоны бақылай алу үшін. Осыдан кейін барлық айнымалылар инициализацияланады, конструктор шақырылады және міне, біздің жаңа нысан өз өмірін өткізіп жатыр :) Нысандардың өмір сүру ұзақтығы әртүрлі, мұнда нақты сандар жоқ. Қалай болғанда да, ол біраз уақыт бағдарламаның ішінде өмір сүреді және өз функцияларын орындайды. Дәлірек айтсақ, an object оған сілтемелер болғанша «тірі». Сілтемелер қалмаған кезде нысан «өледі». Мысалы:
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()Lamborghini Diablo автокөлік нысаны екінші жолда тірі болуды тоқтатады. Оған бір ғана сілтеме болды, енді бұл сілтеме тағайындалды null. Lamborghini Diablo-ға сілтемелер қалмағандықтан, ол «қоқыс» болады. Сілтемені қалпына келтіру қажет емес:
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;
   }

}
Мұнда біз екінші нысанды жасадық, содан кейін сілтемені алып lamborghini, оны осы жаңа нысанға тағайындадық. Енді Lamborghini Gallardoнысанды көрсететін екі сілтеме бар, бірақ Lamborghini Diabloнысанға ешбір сілтеме жоқ. Сондықтан нысан Diabloқоқысқа айналады. Осы сәтте қоқыс жинағыш немесе басқаша айтқанда - Garbage Collector, GC деп аталатын кірістірілген Java механизмі іске қосылады.
Объектінің өмірлік циклі - 2
Қоқыс жинағыш - бұл жадты босатуға, яғни одан қажет емес нысандарды жоюға жауап беретін ішкі Java механизмі. Оны бейнелеу үшін робот шаңсорғышпен суретті таңдауымыз бекер емес. Өйткені, қоқыс жинағыш дәл осылай жұмыс істейді: фондық режимде ол сіздің бағдарламаңыз арқылы «саяхаттап», қоқыс жинайды және сонымен бірге сіз онымен іс жүзінде әрекеттеспейсіз. Оның міндеті – бағдарламада енді пайдаланылмайтын an objectілерді жою. Осылайша, ол басқа нысандар үшін компьютердегі жадты босатады. Дәрістің басында қарапайым өмірде компьютердің күйін бақылап, ескі файлдарды жою керек деп айтқанымыз есіңізде ме? Сонымен, Java нысандары жағдайында қоқыс жинаушы мұны сіз үшін жасайды. Қоқыс жинаушы бағдарламаңыздың жұмысы кезінде бірнеше рет іске қосылады: оны арнайы шақырудың және командалар берудің қажеті жоқ, бірақ бұл техникалық мүмкін. Кейінірек біз бұл туралы көбірек айтып, оның жұмыс процесін толығырақ талдаймыз. Қоқыс жинағыш an objectіге жеткенде, оны жоюдың алдында an objectіге арнайы әдіс шақырылады - finalize(). Оны нысан пайдаланған кейбір қосымша ресурстарды босату үшін пайдалануға болады. Әдіс finalize()классқа жатады Object. Яғни, бұрын кездескен , және -мен бірге кез келген нысанда ол equals()бар hashCode(). toString()Оның басқа әдістерден айырмашылығы – ол... қалай қою керек... өте капризді. Атап айтқанда, ол әрқашан нысанды жоймас бұрын шақырылмайды. Бағдарламалау - бұл нақты нәрсе. Программист компьютерге бірдеңе істеу керектігін айтады, ал компьютер оны жасайды. Сіз бұл мінез-құлыққа үйреніп қалған шығарсыз және сізге алдымен идеяны қабылдау қиын болуы мүмкін: «Объектілер жойылмай тұрып, сынып finalize()әдісі деп аталады Object. Немесе ол аталмайды. Сәті түсіп жатса!» Дегенмен, бұл шындық. finalize()Әрбір нақты жағдайда әдісті шақыру керек пе, жоқ па, Java машинасының өзі анықтайды . Мысалы, эксперимент үшін келесі codeты іске қосып көрейік:
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 уничтожен!");
   }
}
Біз an object жасаймыз Catжәне codeтың келесі жолында оған жалғыз сілтемені қалпына келтіреміз. Сонымен - миллион рет. Біз әдісті анық түрде қайта анықтадық finalize()және ол нысанды жоймас бұрын жолды консольге миллион рет басып шығаруы керек Cat. Бірақ жоқ! Дәлірек айтсақ, ол менің компьютерімде бар болғаны 37 346 рет жұмыс істеді! Яғни, 27 жағдайдың 1-інде ғана мен орнатқан Java машинасы әдісті шақыруды шешті finalize()- басқа жағдайларда қоқыс жинау онсыз жүрді. Бұл codeты өзіңіз іске қосып көріңіз: нәтиже басқаша болуы мүмкін. Көріп отырғаныңыздай, оны сенімді серіктес деп айту қиын :) Сондықтан, болашаққа арналған шағын кеңес: кейбір маңызды ресурстарды босату жағдайында finalize()әдіске сенбеу керек . finalize()Мүмкін JVM оны шақырады, мүмкін емес. Кім біледі? Егер сіздің an objectіңіз өзінің қызмет ету мерзімі ішінде өнімділік үшін өте маңызды кейбір ресурстарды иемденсе, мысалы, ол дерекқорға ашық қосылымды сақтаса, оларды босату үшін сыныпта арнайы әдісті жасаған дұрыс және an object ашылған кезде оны нақты шақырған дұрыс. енді қажет емес. Осылайша сіз өзіңіздің бағдарламаңыздың өнімділігі төмендемейтініне сенімді боласыз. Ең басында біз жадты басқару және қоқысты жою өте маңызды екенін айттық және бұл дұрыс. Ресурстарды дұрыс пайдаланбау және қажетсіз нысандарды жинау процесін түсінбеу жадтың ағып кетуіне әкелуі мүмкін. Бұл ең танымал бағдарламалау қателерінің бірі. Бағдарламалаушының қате жазған codeы жаңадан жасалған нысандар үшін әр уақытта жаңа жадтың бөлінуіне әкелуі мүмкін, ал ескі, қажетсіз нысандар қоқыс жинаушымен жойылуы мүмкін емес. Біз робот шаңсорғышқа ұқсастық жасағандықтан, роботты іске қоспас бұрын үйдің айналасына шұлықтарды шашып, шыны вазаны сындырып, еденге бөлшектелген Лего жинағын қалдырсаңыз, не болатынын елестетіп көріңіз. Робот, әрине, бірдеңе жасауға тырысады, бірақ бір сәтте ол кептеліп қалады.
Объектінің өмірлік циклі - 3
Оның дұрыс жұмыс істеуі үшін еденді жақсы күйде ұстау керек және одан шаңсорғыш көтере алмайтын барлық нәрсені алып тастау керек. Қоқыс жинағыш дәл осындай принцип бойынша жұмыс істейді. Бағдарламада жинай алмайтын көптеген заттар қалса (мысалы, шұлық немесе робот шаңсорғышқа арналған Лего), бір сәтте жад таусылады. Ал сіз жазған бағдарлама ғана емес, компьютерде сол сәтте жұмыс істейтін басқа бағдарламалар да қатып қалады. Олар үшін де жад жеткіліксіз болады. Java тілінде нысанның өмірлік циклі және қоқыс жинағышы осылай көрінеді. Мұны есте сақтаудың қажеті жоқ: жұмыс принципін түсіну жеткілікті. Келесі дәрісте біз бұл процестер туралы толығырақ айтатын боламыз, бірақ қазір JavaRush мәселелерін шешуге оралуға болады :) Сәттілік!
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION