JavaRush /Java блогу /Random-KY /Объекттин жашоо цикли

Объекттин жашоо цикли

Группада жарыяланган
Салам! Компьютериңиздеги эс тутумдун көлөмү чектелген деп айтсак, таң калбайсыз деп ойлойм :) RAMдан бир нече эсе чоң болгон катуу дискти да сүйүктүү оюндарыңыз, телесериалдарыңыз менен толтурса болот. жана башка. Мунун алдын алуу үчүн, сиз эстутумдун учурдагы абалын көзөмөлдөп, компьютериңизден керексиз файлдарды жок кылышыңыз керек. Мунун баарына Java программалоосунун кандай тиешеси бар? Түздөн-түз! Анткени, кандайдыр бир an object Java машинасы тарабынан түзүлгөндө, эс ал үчүн бөлүнгөн. Чыныгы чоң программада он жана жүз миңдеген an objectилер түзүлөт, алардын ар бири өзүнүн эс тутумуна ээ. Объекттин жашоо цикли - 1Бирок, сиздин оюңузча, бул an objectтердин бардыгы канча убакыт бар? Алар биздин программа иштеп жаткан убакыттын баарында “жашаабы”? Албетте жок. Java an objectтеринин бардык артыкчылыктары менен алар өлбөс эмес :) Объекттердин өзүнүн жашоо цикли бар. Бүгүн биз code жазуудан бир аз тыныгуу алып, бул процессти карайбыз :) Андан тышкары, бул программанын иштешин түшүнүү жана ресурстарды башкаруу үчүн абдан маанилүү. Демек, an objectтин жашоосу эмнеден башталат? Адам сыяктуу - төрөлгөндөн, б.а.
Cat cat = new Cat();//вот сейчас и начался vital цикл нашего an object Cat!
Биринчиден, Java Virtual Machine an objectти түзүү үчүн эстутумдун керектүү көлөмүн бөлүп берет. Андан кийин ал ага шилтеме жаратат, биздин учурда - catага көз салуу үчүн. Андан кийин, бардык өзгөрмөлөр инициализацияланат, конструктор чакырылат жана мына, биздин жаңы an objectибиз өз жашоосун жашап жатат :) Объекттердин иштөө мөөнөтү ар башка, бул жерде так сандар жок. Кандай болгон күндө да, бир нече убакыт бою ал программанын ичинде жашап, өз функцияларын аткарат. Тагыраак айтканда, 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()Lamborghini Diablo унаа an objectи экинчи сапта жашоону токтотот. Ага бир гана шилтеме бар болчу, эми бул шилтеме дайындалды 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 Gallardoan objectке көрсөткөн эки шилтеме бар, бирок Lamborghini Diabloan objectке эч кимиси жок. Ошондуктан an object Diabloташтандыга айланат. Мына ушул учурда, таштанды жыйноочу, же башкача айтканда - таштанды жыйноочу, GC деп аталган орнотулган Java механизми ишке кирет.
Объекттин жашоо цикли - 2
Таштанды жыйноочу - бул эстутумду бошотуу, башкача айтканда, андан керексиз an objectтерди алып салуу үчүн жооптуу болгон ички Java механизми. Аны сүрөттөө үчүн робот чаң соргуч менен сүрөттү тандап алганыбыз бекер эмес. Анткени, таштанды жыйноочу дагы дал ушундай иштейт: фонунда ал сиздин программаңыз аркылуу "саякат кылат", таштанды чогултат жана ошол эле учурда сиз аны менен иш жүзүндө эч кандай мамиледе болбойсуз. Анын милдети программада колдонулбай калган an objectтерди алып салуу. Ошентип, ал башка an objectтер үчүн компьютердеги эстутумду бошотот. Лекциянын башында биз жөнөкөй жашоодо компьютериңиздин абалын көзөмөлдөп, эски файлдарды жок кылышыңыз керек деп айтканыбыз эсиңиздеби? Ошентип, Java an objectилеринде таштанды жыйноочу муну сиз үчүн кылат. Таштанды жыйноочу программаңыз иштеп жатканда көп жолу ишке киргизилет: аны атайын чакырып, буйруктарды берүүнүн кереги жок, бирок бул техникалык жактан мүмкүн. Кийинчерээк биз бул тууралуу кененирээк айтып, анын иштөө процессин кеңири талдап чыгабыз. Таштанды жыйноочу an objectке жеткен учурда, аны жок кылуунун алдында, an objectте атайын ыкма чакырылат - finalize(). Бул an object колдонуп жаткан кээ бир кошумча ресурстарды бошотуу үчүн колдонулушу мүмкүн. Метод finalize()класска таандык Object. Башкача айтканда, сиз мурда жолуккан , жана менен бирге ар кандай an objectте ага equals()ээ hashCode(). toString()Анын башка ыкмалардан айырмасы – бул... аны кантип коюу... өтө каприз. Тактап айтканда, ал дайыма эле an objectти жок кылуу алдында деп атала бербейт. Программалоо - бул так нерсе. Программист компьютерге бир нерсе жаса деп айтат, ал эми компьютер аны аткарат. Сиз бул жүрүм-турумга мурунтан эле көнүп калгандырсыз жана сиз үчүн адегенде бул идеяны кабыл алуу кыйын болушу мүмкүн: “Объекттер жок кылынганга чейин класстын finalize()ыкмасы деп аталат Object. Же аталbyte. Бактылуу болсок!" Бирок, бул чындык. 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()жана ал an objectти жок кылганга чейин сапты консолго миллион жолу басып чыгарышы керек Cat. Бирок жок! Тагыраак айтканда, ал менин компьютеримде 37 346 жолу гана иштеди! Башкача айтканда, 27 учурдун 1инде гана мен орноткон Java машинасы методду чакыруу чечимин кабыл алган finalize()- башка учурларда таштанды чогултуу ансыз да уланган. Бул codeду өзүңүз иштетип көрүңүз: балким, натыйжа башкача болот. Көрүнүп тургандай, аны ишенимдүү өнөктөш деп айтуу кыйын :) Ошондуктан, келечекке бир аз кеңеш: кээ бир маанилүү ресурстарды бошоткон учурда, finalize()ыкмага таянбашыңыз керек . finalize()Балким, JVM аны чакырат, балким, жок. Ким билет? Эгерде сиздин an objectиңиз өз өмүрүнүн ичинде аткаруу үчүн өтө маанилүү болгон кээ бир ресурстарды ээлесе, мисалы, ал маалымат базасы менен ачык байланышты сактаса, аларды бошотуу үчүн классыңызда атайын ыкманы түзүп, an object болгондо аны ачык чакырган жакшы. мындан ары кереги жок. Ушундай жол менен сиз программаңыздын аткарылышы зыян тартпай турганын так билесиз. Башында биз эс тутумду башкаруу жана таштандыларды чыгаруу абдан маанилүү экенин айтканбыз, бул чындык. Ресурстарды туура эмес иштетүү жана керексиз an objectтерди чогултуу процессин түшүнбөө эс тутумдун агып кетишине алып келиши мүмкүн. Бул эң белгилүү программалоо каталарынын бири. Программист тарабынан туура эмес жазылган code жаңы түзүлгөн an objectтер үчүн ар бир жолу жаңы эстутумдун бөлүнүшүнө алып келиши мүмкүн, ал эми эски, керексиз an objectтер таштанды жыйноочу тарабынан жок кылынbyte. Биз робот чаң соргучка окшоштук жасагандыктан, роботту ишке киргизүүдөн мурун үйдүн айланасына байпактарды чачып, айнек вазаны сындырып, жерге бөлүкчөлөрдөн турган Лего топтомун таштап койсоңуз, эмне болорун элестетип көрүңүз. Робот, албетте, бир нерсе кылууга аракет кылат, бирок бир учурда ал тыгылып калат.
Объекттин жашоо цикли - 3
Ал туура иштеши үчүн полду жакшы абалда кармап, чаң соргуч көтөрө албаган нерселердин баарын ал жерден алып салышыңыз керек. Таштанды жыйноочу дагы ушундай принцип менен иштейт. Эгерде программада чогулта албаган көптөгөн an objectтер калса (мисалы, робот чаң соргуч үчүн байпак же Лего), бир учурда эс тутум түгөнүп калат. Жана сиз жазган программа гана эмес, ошол учурда компьютерде иштеген башка программалар да тоңуп калат. Алар үчүн да эс тутум жетишсиз болот. Java'да an objectтин жашоо цикли жана таштанды жыйноочу ушундай көрүнөт. Муну жаттап алуунун кереги жок: жөн гана иштөө принцибин түшүнүү. Кийинки лекцияда биз бул процесстер тууралуу кененирээк сөз кылабыз, бирок азыр JavaRush көйгөйлөрүн чечүүгө кайтсаңыз болот :) Ийгorк!
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION