JavaRush /Java Blog /Random-TK /Obýektiň ýaşaýyş sikli

Obýektiň ýaşaýyş sikli

Toparda çap edildi
Salam! Kompýuteriňizdäki ýadyň ululygynyň çäklidigini aýtsak, gaty geň görmersiňiz :) Hat-da RAM-dan birnäçe esse uly gaty disk hem halaýan oýunlaryňyz, teleseriallaryňyz bilen doldurylyp bilner, we ş.m. Munuň ýüze çykmazlygy üçin ýadyň häzirki ýagdaýyna gözegçilik etmeli we kompýuteriňizden gereksiz faýllary pozmaly. Java programmirlemegiň bularyň hemmesi bilen näme baglanyşygy bar? Göni! Galyberse-de, Java enjamy tarapyndan haýsydyr bir obýekt döredilende, onuň üçin ýat bölünýär. Hakyky uly programmada onlarça we ýüzlerçe müň obýekt döredilýär, olaryň hersiniň öz ýady bölegi bar. Obýektiň ýaşaýyş sikli - 1Theseöne bu zatlaryň hemmesi näçe wagt bar diýip pikir edýärsiňiz? Programmamyz işleýän wagty "ýaşap" ýaşaýarlarmy? Elbetde ýok. Java obýektleriniň ähli artykmaçlyklary bilen ölmez-ýitmez :) Obýektleriň öz durmuş aýlawy bar. Bu gün kod ýazmakdan azajyk dynç alarys we bu prosese serederis :) Mundan başga-da, programmanyň işine düşünmek we çeşmeleri dolandyrmak gaty möhümdir. Onda, jisimiň ömri nireden başlaýar? Adam ýaly - doglan gününden, ýagny ýaradylyşdan.
Cat cat = new Cat();//вот сейчас и начался vital цикл нашего an object Cat!
Ilki bilen, Java Wirtual Machine obýekti döretmek üçin zerur mukdarda ýady bölýär. catSoňra bolsa, ony yzarlamak üçin , oňa baglanyşyk döredýär . Ondan soň ähli üýtgeýjiler işe girizilýär, konstruktor diýilýär, ine, täze obýektimiz eýýäm öz durmuşyny dowam etdirýär :) Obýektleriň ömri başga, bu ýerde takyk san ýok. Her niçigem bolsa, belli bir wagtlap programmanyň içinde ýaşaýar we wezipelerini ýerine ýetirýär. Has takygy, bir obýekt oňa salgylanmalar bar bolsa “diridir”. Baglanyşyk galmadyk badyna obýekt “ölýär”. Mysal üçin:
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” awtoulag obýekti ikinji setirde eýýäm diri galmagyny bes edýär. Oňa diňe bir baglanyşyk bardy, indi bu baglanyşyk bellendi null. Lamborghini Diablo hakda hiç hili salgylanma galmansoň, ol “gereksiz” bolýar. Baglanyşygy täzeden düzmek hökman däl:
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 ýerde ikinji bir obýekt döretdik, şondan soň salgylanmany alyp lamborghini, bu täze obýekte belledik. Indi Lamborghini Gallardoobýekte yşarat edýän iki salgylanma bar, ýöne Lamborghini Diabloobýekte salgylanma ýok. Şonuň üçin obýekt Diablozibile öwrülýär. Häzirki wagtda zibil ýygnaýjy ýa-da başga bir söz bilen aýdylanda gurlan “Java” mehanizmi işe girýär.
Obýektiň ýaşaýyş sikli - 2
Zibil ýygnaýjy, ýadyň boşadylmagyna, ýagny zerur däl zatlary aýyrmaga jogapkär içerki Java mehanizmidir. Ony suratlandyrmak üçin robot tozan sorujy bilen suraty saýlamagymyz hiç zat däldi. Galyberse-de, zibil ýygnaýjy birmeňzeş işleýär: fonda, programmaňyzyň üsti bilen “syýahat edýär”, zibil ýygnaýar we şol bir wagtyň özünde onuň bilen iş salyşmaýarsyňyz. Onuň işi, programmada indi ulanylmaýan zatlary aýyrmak. Şeýlelik bilen, beýleki zatlar üçin kompýuterdäki ýady boşadýar. Leksiýanyň başynda adaty durmuşda kompýuteriňiziň ýagdaýyna gözegçilik etmeli we köne faýllary pozmaly diýdikmi? Şeýlelik bilen, Java obýektleri bolsa, zibil ýygnaýjy muny siziň üçin edýär. Zibil ýygnaýjy, programmaňyzyň işleýşi wagtynda köp gezek işe girizilýär: tehniki taýdan mümkin bolsa-da, ýörite çagyrylmaly we buýruk berilmeli däl. Soňrak bu hakda has giňişleýin gürleşeris we işiniň gidişini has jikme-jik seljereris. Zibil ýygnaýjy obýekte ýeten pursatynda, ýok edilmezinden ozal obýektde ýörite usul çagyrylýar - finalize(). Obýektiň ulanýan käbir goşmaça çeşmelerini boşatmak üçin ulanylyp bilner. Usul finalize()synpa degişlidir Object. .Agny, equals()öňem tanyşan hashCode()we islendik obýektiň özi bar. toString()Beýleki usullardan tapawudy, ony ... nädip goýmalydygy ... gaty özüne çekiji. .Agny, bir zady ýok etmezden ozal hemişe çagyrylmaýar. Programmirlemek takyk bir zat. Programmist kompýutere bir zat etmegi aýdýar we kompýuter muny edýär. Bu gylyk-häsiýeti eýýäm öwrenişen bolsaňyz gerek, ilki bilen bu pikiri kabul etmek kyn bolmagy mümkin: “Obýektler ýok edilmezden ozal synp finalize()usuly diýilýär Object. Ora-da çagyrylmaýar. Bagtly bolsak! " Emma bu hakykat. finalize()Java maşynynyň özi, her aýratyn ýagdaýda usuly çagyrmagyň ýa-da çagyrmazlygy kesgitleýär . Mysal üçin, synag üçin aşakdaky kody işletmäge synanyşalyň:
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 уничтожен!");
   }
}
Bir obýekt döredýäris Catwe indiki setirde oňa ýeke-täk salgylanmany täzeden düzýäris. Şeýdip, million gezek. Usuly aç-açan ýatyrdyk finalize(), ol obýekti ýok etmezden ozal her gezek konsola million gezek çap edilmeli Cat. Nook! Has takygy, meniň kompýuterimde diňe 37,346 gezek işledi! .Agny, gurnan Java maşynymyň 27-den diňe 1-sinde bir usul çagyrmak kararyna geldi finalize()- beýleki ýagdaýlarda zibil ýygnamak onsuz dowam etdi. Bu kody özüňiz synap görüň: netijesi başgaça bolar. Görşüňiz ýaly, finalize()oňa ygtybarly hyzmatdaş diýmek kyn :) Şonuň üçin gelejek üçin azajyk maslahat: finalize()käbir möhüm çeşmeleri boşadanyňyzda usula bil baglamaly dälsiňiz. Belki, JVM oňa jaň eder, belki ýok. Kim bilýär? Ömrüniň dowamynda obýektiňiz öndürijilik üçin gaty möhüm bolan käbir çeşmeleri eýeleýän bolsa, mysal üçin maglumatlar bazasyna açyk baglanyşyk saklasa, synpyňyzda olary boşatmak we obýekt bolanda aç-açan çagyrmak üçin ýörite usul döretmek has gowudyr. indi zerur däl. Şeýlelik bilen, programmaňyzyň ýerine ýetirilişiniň zyýan bermejekdigini anyk bilersiňiz. Ilkibaşda ýady dolandyrmak we zibil aýyrmak gaty möhüm diýdik we bu hakykat. Resurslaryň nädogry ulanylmagy we gereksiz zatlary ýygnamak prosesine düşünmezlik ýadyň syzmagyna sebäp bolup biler. Bu iň meşhur programmirleme ýalňyşlyklaryndan biridir. Programmist tarapyndan nädogry ýazylan kod, täze döredilen obýektler üçin her gezek täze ýadyň bölünmegine sebäp bolup biler, köne, gereksiz zatlar bolsa zibil ýygnaýjy tarapyndan aýrylmaz. Robot tozan sorujy bilen meňzeşlik döredenimizden soň, roboty işe başlamazdan ozal joraplary öýüň töweregine dargadyp, aýna wazany döwüp, sökülmedik Lego poluň üstünde goýsaňyz näme boljagyny göz öňüne getiriň. Elbetde, robot bir zatlar etmäge synanyşar, ýöne bir wagt ýapyşar.
Obýektiň ýaşaýyş sikli - 3
Dogry işlemegi üçin poly gowy ýagdaýda saklamaly we tozan sorujynyň alyp bilmejek zatlaryny ol ýerden aýyrmaly. Zibil ýygnaýjy şol bir prinsipde işleýär. Programmada ýygnap bilmeýän köp zat bar bolsa (robot tozan sorujy üçin jorap ýa-da Lego ýaly), bir wagt ýat ýitip gidýär. Diňe ýazan programmaňyz däl, şol pursatda kompýuterde işleýän beýleki programmalaram doňup galar. Olara-da ýeterlik ýat bolmaz. “Java” -da obýektiň ýaşaýyş sikli we zibil ýygnaýjy görnüşi. Muny ýatda saklamagyň hajaty ýok: diňe iş prinsipine düşüniň. Indiki leksiýada bu prosesler barada has jikme-jik gürleşeris, ýöne häzirlikçe JavaRush meselelerini çözmäge gaýdyp bilersiňiz :) Sag boluň!
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION