JavaRush /Блоги Java /Random-TG /Давраи ҳаёти объект

Давраи ҳаёти объект

Дар гурӯҳ нашр шудааст
Салом! Ман фикр мекунам, ки агар мо ба шумо бигӯем, ки андозаи хотираи компютери шумо маҳдуд аст, ҳайрон нахоҳед шуд :) Ҳатто як диски сахт, ки аз RAM чанд маротиба калонтар аст, метавонад бо бозиҳои дӯстдоштаи худ, сериалҳои телевизионӣ, ва ғайра. Барои пешгирии ин ҳолат, шумо бояд ҳолати ҷории хотираро назорат кунед ва файлҳои нолозимро аз компютери худ нест кунед. Барномасозии Java бо ин ҳама чӣ иртибот дорад? Бевосита! Дар ниҳоят, вақте ки ягон an object тавассути мошини Java сохта мешавад, хотира барои он ҷудо карда мешавад. Дар як барномаи воқеии калон даҳҳо ва садҳо ҳазор an objectҳо эҷод карда мешаванд, ки ҳар яки онҳо қисмати хотираи худро доранд. Давраи ҳаёти an object - 1Аммо шумо фикр мекунед, ки ин ҳама an objectҳо то кай вуҷуд доранд? Оё онҳо тамоми вақти иҷро шудани барномаи мо "зиндагӣ мекунанд"? Албатта не. Бо тамоми бартариҳои an objectҳои Java, онҳо ҷовидона нестанд :) Объектҳо давраи зиндагии худро доранд. Имрӯз мо аз навиштани code каме танаффус мегирем ва ин равандро дида мебароем :) Гузашта аз ин, барои фаҳмидани кори барнома ва идоракунии захираҳо хеле муҳим аст. Пас, ҳаёти an object аз куҷо оғоз мешавад? Мисли одам - ​​аз таваллуд, яъне офариниш.
Cat cat = new Cat();//вот сейчас и начался vital цикл нашего an object Cat!
Аввалан, мошини виртуалии Java миқдори зарурии хотираро барои сохтани an object ҷудо мекунад. Он гоҳ вай ба он пайванд эҷод мекунад, дар ҳолати мо - catто тавонанд онро пайгирӣ кунад. Пас аз ин, ҳама тағирёбандаҳо оғоз карда мешаванд, конструктор даъват карда мешавад ва инак, an objectи тозаи мо аллакай ҳаёти худро ба сар мебарад :) Муҳлати умри an objectҳо гуногун аст, дар ин ҷо рақамҳои дақиқ вуҷуд надоранд. Дар ҳар сурат, муддате дар дохor барнома зиндагӣ мекунад ва вазифаҳои худро иҷро мекунад. Аниқтараш, an object "зинда" аст, то даме ки истинод ба он вуҷуд дорад. Ҳамин ки ягон пайванд боқӣ намондааст, 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()an objectи мошини 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;
   }

}
Дар ин ҷо мо an objectи дуюмро сохтем, ки баъд аз он мо истинодро гирифтем lamborghiniва онро ба ин an objectи нав таъин кардем. Ҳоло Lamborghini Gallardoду истинод ба an object ишора мекунад, аммо Lamborghini Diabloҳеҷ кадоме ба an object нест. Бинобар ин an object Diabloба ахлот табдил меёбад. Ва дар ин лаҳза, механизми дарунсохташудаи Java, ки коллектори партов номида мешавад, ё ба ибораи дигар - Garbage Collector, GC ба кор медарояд.
Давраи ҳаёти an object - 2
Ҷамъоварии партов як механизми дохorи Java мебошад, ки барои озод кардани хотира, яъне хориҷ кардани an objectҳои нолозим аз он масъул аст. Бесабаб набуд, ки мо барои тасвир кардани он расмро бо робот чангкашак интихоб кардем. Дар ниҳоят, ҷамъкунандаи ахлот тақрибан ҳамин тавр кор мекунад: дар замина он тавассути барномаи шумо "сафар мекунад", партовҳоро ҷамъ мекунад ва дар айни замон шумо амалан бо он муошират намекунед. Вазифаи он нест кардани an objectҳое мебошад, ки дигар дар барнома истифода намешаванд. Ҳамин тариқ, он хотираи компютерро барои дигар an objectҳо холӣ мекунад. Дар хотир доред, ки дар оғози лексия мо гуфта будем, ки дар ҳаёти оддӣ шумо бояд ҳолати компютери худро назорат кунед ва файлҳои кӯҳнаро нест кунед? Ҳамин тавр, дар мавриди an objectҳои Java, коллектори ахлот ин корро барои шумо мекунад. Гарbage Collector дар давоми кори барномаи шумо борҳо ба кор андохта мешавад: онро махсус даъват кардан ва фармон додан лозим нест, гарчанде ки ин аз ҷиҳати техникӣ имконпазир аст. Баъдтар дар бораи он бештар сухан меронем ва рафти кори онро муфассалтар тахлил мекунем. Дар лахзае, ки хошоктайёркунй ба an object мерасад, пеш аз нобудшавии он дар an object усули махсус даъват карда мешавад - finalize(). Он метавонад барои озод кардани баъзе захираҳои иловагӣ, ки an object истифода мекард, истифода шавад. Усул finalize()ба синф тааллуқ дорад Object. Яъне дар баробари equals(), hashCode()ва toString(), ки шумо қаблан шинос шудаед, ҳама гуна an object онро дорад. Фарқи он аз дигар усулҳо дар он аст, ки он... чӣ тавр гуфтан мумкин аст... хеле инҷиқӣ аст. Маҳз, он на ҳамеша пеш аз нобуд кардани an object даъват карда мешавад. Барномасозӣ як чизи дақиқ аст. Барномасоз ба компютер мегӯяд, ки кореро анҷом диҳад ва компютер ин корро мекунад. Эҳтимол шумо аллакай ба ин рафтор одат кардаед ва шояд дар аввал қабул кардани идея барои шумо душвор бошад: «Пеш аз нобудшавии an objectҳо, усули finalize()синф номида мешавад Object. Ё ин ки номида намешавад. Агар насибамон шавад!" Бо вуҷуди ин, ин дуруст аст. Мошини Java худаш муайян мекунад, ки оё дар ҳар як ҳолати мушаххас усул даъват карда мешавад finalize()ё не. Масалан, биёед кӯшиш кунем, ки 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()ва он бояд сатрро ба консол миллион маротиба чоп кунад, ҳар дафъа пеш аз нобуд кардани an object Cat. Аммо не! Аниқтараш, он дар компютери ман танҳо 37,346 маротиба кор мекард! Яъне, танҳо дар 1 ҳолат аз 27 мошини Java, ки ман насб кардам, тасмим гирифт, ки усулро даъват кунад finalize()- дар дигар ҳолатҳо, ҷамъоварии партовҳо бидуни ин идома ёфт. Кӯшиш кунед, ки ин codeро худатон иҷро кунед: эҳтимолан натиҷа дигар хоҳад буд. Тавре ки шумо мебинед, finalize()онро шарики боэътимод номидан душвор аст :) Аз ин рӯ, каме маслиҳат барои оянда: шумо набояд ба усул finalize()дар сурати озод кардани баъзе захираҳои муҳим такя кунед. Шояд JVM онро даъват кунад, шояд не. Чӣ тавр донистан? Агар дар давоми умри худ an objectи шумо баъзе захираҳоеро ишғол карда бошад, ки барои иҷроиш хеле муҳим буданд, масалан, он ба пойгоҳи додаҳо пайвасти кушода нигоҳ дошта бошад, беҳтар аст, ки дар синфи худ усули махсусеро эҷод кунед, то онҳоро озод кунад ва ҳангоми кушодани an object онро ба таври возеҳ даъват кунад. дигар лозим нест. Бо ин роҳ шумо аниқ хоҳед дид, ки иҷрои барномаи шумо зарар намебинад. Дар аввал мо гуфтем, ки идоракунии хотира ва тоза кардани партовҳо хеле муҳим аст ва ин дуруст аст. Муносибати номуносиб бо захираҳо ва нафаҳмидани раванди ҷамъ овардани an objectҳои нодаркор метавонад боиси ихроҷи хотира гардад. Ин яке аз хатогиҳои машҳуртарини барномасозӣ мебошад. Рамзи нодуруст навишташудаи барномасоз метавонад боиси он гардад, ки ҳар дафъа барои an objectҳои навтаъсис хотираи нав ҷудо карда мешавад, дар ҳоле ки an objectҳои кӯҳна ва нолозим барои хориҷ кардани партовгоҳ дастрас нестанд. Азбаски мо бо чангкашаки робот монанд карда будем, тасаввур кунед, ки агар шумо пеш аз ба кор андохтани робот ҷӯробҳоро дар гирду атрофи хона пароканда карда, гулдони шишагинро шикастед ва як маҷмӯаи Легои ҷудошуда дар фарш гузоред, чӣ мешавад. Робот, албатта, кӯшиш мекунад, ки чизеро иҷро кунад, аммо дар як вақт он дармонда мешавад.
Давраи ҳаёти an object - 3
Барои он ки он дуруст кор кунад, ба шумо лозим аст, ки фаршро дар ҳолати хуб нигоҳ доред ва ҳама чизро аз он ҷо тоза кунед, ки чангкашак аз ӯҳдаи он баромада наметавонад. Хошоктайёркунй аз руи хамин принцип кор мекунад. Агар дар барнома ашёи зиёде боқӣ монад, ки онҳо ҷамъ карда наметавонанд (ба мисли ҷӯроб ё Лего барои чангкашаки робот), дар як лаҳза хотира тамом мешавад. Ва на танҳо барномае, ки шумо навиштед, инчунин ҳамаи барномаҳои дигаре, ки дар он лаҳза дар компютер кор мекунанд, ях мекунанд. Барои онҳо низ хотираи кофӣ нахоҳад буд. Ин аст, ки давраи ҳаёти an object ва коллектори партовҳо дар Java монанд аст. Инро дар хотир доштан лозим нест: факат принципи корро фахмед. Дар лексияи навбатӣ мо дар бораи ин равандҳо муфассалтар сӯҳбат хоҳем кард, аммо ҳоло шумо метавонед ба ҳалли мушкилоти JavaRush баргардед :) Барори кор!
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION