JavaRush /جاوا بلاگ /Random-SD /آبجیکٹ زندگي چڪر

آبجیکٹ زندگي چڪر

گروپ ۾ شايع ٿيل
سلام! منهنجو خيال آهي ته توهان کي حيرت نه ٿيندي جيڪڏهن اسان توهان کي ٻڌايو ته توهان جي ڪمپيوٽر تي ميموري جي سائيز محدود آهي :) ايستائين جو هارڊ ڊرائيو، جيڪا رام کان ڪيترائي ڀيرا وڏي آهي، توهان جي پسنديده رانديون، ٽي وي سيريز، ۽ ايئن. ائين ٿيڻ کان روڪڻ لاء، توهان کي ميموري جي موجوده حالت مانيٽر ڪرڻ جي ضرورت آهي ۽ توهان جي ڪمپيوٽر مان غير ضروري فائلن کي حذف ڪرڻ جي ضرورت آهي. جاوا پروگرامنگ جو هن سڀني سان ڇا تعلق آهي؟ سڌو! سڀ کان پوء، جڏهن ڪا به شئي جاوا مشين ٺاهي ٿي، ياداشت ان لاء مختص ڪئي وئي آهي. هڪ حقيقي وڏي پروگرام ۾، ڏهه ۽ سئو هزارين شيون ٺاهيا ويا آهن، جن مان هر هڪ کي پنهنجي ميموري جو ٽڪرو مختص ڪيو ويو آهي. اعتراض جي زندگي چڪر - 1پر توهان ڪيترو وقت سوچيو ٿا ته اهي سڀئي شيون موجود آهن؟ ڇا اهي ”رهن ٿا“ سڄو وقت اسان جو پروگرام هلي رهيو آهي؟ بلڪل نه. جاوا شين جي سڀني فائدن سان، اهي امر نه آهن :) شيون پنهنجون زندگيون آهن. اڄ اسان ڪوڊ لکڻ کان ٿورو وقفو وٺنداسين ۽ هن عمل کي ڏسو :) ان کان علاوه، پروگرام جي آپريشن کي سمجهڻ ۽ وسيلن کي منظم ڪرڻ لاء تمام ضروري آهي. تنهن ڪري، ڪنهن شئي جي زندگي ڪٿي شروع ٿئي ٿي؟ هڪ شخص وانگر - هن جي پيدائش کان، اهو آهي، تخليق.
Cat cat = new Cat();//вот сейчас и начался vital цикл нашего an object Cat!
پهريون، جاوا ورچوئل مشين کي ميموري جي ضروري رقم مختص ڪري ٿي اعتراض ٺاهڻ لاءِ. پوء هوء ان کي هڪ لنڪ ٺاهي، اسان جي صورت ۾ - catان کي ٽريڪ ڪرڻ جي قابل ٿي. ان کان پوء، سڀئي متغيرات شروع ڪيا ويا آهن، تعمير ڪندڙ سڏيو ويندو آهي، ۽ ڏسو ۽ ڏسو، اسان جو تازو اعتراض اڳ ۾ ئي پنهنجي زندگي گذاري رهيو آهي :) شين جي زندگي مختلف آهي، هتي ڪو به صحيح انگ نه آهي. ڪنهن به صورت ۾، اهو ڪجهه وقت تائين پروگرام جي اندر رهي ٿو ۽ پنهنجي ڪم کي انجام ڏئي ٿو. صحيح هجڻ لاءِ، ڪا شئي ”زنده“ آهي جيستائين ان جا حوالا موجود آهن. جيترو جلدي ڪو به لنڪ باقي نه آهي، اعتراض "مرندو" آهي. مثال طور:
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ڪچرو بڻجي وڃي ٿي. ۽ هن وقت، تعمير ٿيل جاوا ميکانيزم کي ردي جي ڪليڪٽر سڏيو ويندو آهي، يا ٻين لفظن ۾ - گاربيج ڪليڪٽر، جي سي، ڪم ۾ اچي ٿو.
اعتراض جي زندگي چڪر - 2
ڪچرو جمع ڪندڙ هڪ اندروني جاوا ميڪانيزم آهي جيڪو ميموري کي آزاد ڪرڻ جو ذميوار آهي، اهو آهي، ان مان غير ضروري شيون هٽائڻ. اهو ڪجھ به نه هو ته اسان ان کي ظاهر ڪرڻ لاءِ روبوٽ ويڪيوم ڪلينر سان هڪ تصوير چونڊيو. سڀ کان پوء، ڪچرو ڪليڪٽر تمام گهڻو ڪم ڪري ٿو: پس منظر ۾، اهو توهان جي پروگرام ذريعي "سفر" ڪري ٿو، ڪچرو گڏ ڪري ٿو، ۽ ساڳئي وقت توهان عملي طور تي ان سان رابطو نه ڪيو. ان جو ڪم انهن شين کي هٽائڻ آهي جيڪي هاڻي پروگرام ۾ استعمال نه ٿيون ٿين. اهڙيء طرح، اهو ٻين شين لاء ڪمپيوٽر ۾ ميموري کي آزاد ڪري ٿو. ڇا توهان کي ياد آهي ته ليڪچر جي شروعات ۾ اسان چيو هو ته عام زندگي ۾ توهان کي پنهنجي ڪمپيوٽر جي حالت کي مانيٽر ڪرڻو پوندو ۽ پراڻي فائلن کي حذف ڪرڻو پوندو؟ تنهن ڪري، جاوا شين جي صورت ۾، ڪچرو جمع ڪندڙ اهو توهان لاء ڪندو آهي. گاربيج ڪليڪٽر توهان جي پروگرام جي آپريشن دوران ڪيترائي ڀيرا شروع ڪيو ويو آهي: ان کي خاص طور تي سڏڻ جي ضرورت ناهي ۽ حڪم ڏنو ويو آهي، جيتوڻيڪ اهو ٽيڪنالاجي طور ممڪن آهي. بعد ۾ اسان ان بابت وڌيڪ ڳالهائينداسين ۽ ان جي ڪم جي عمل کي وڌيڪ تفصيل سان تجزيو ڪنداسين. هن وقت جڏهن ڪچرو گڏ ڪندڙ اعتراض تي پهچي ٿو، ان جي تباهي کان ٿورو اڳ، اعتراض تي هڪ خاص طريقو سڏيو ويندو آهي - finalize(). اهو استعمال ڪري سگهجي ٿو ڪجهه اضافي وسيلن کي آزاد ڪرڻ لاءِ جيڪو اعتراض استعمال ڪري رهيو هو. طريقو finalize()طبقي سان تعلق رکي ٿو Object. اهو آهي، سان گڏ equals()، hashCode()۽ toString()، جيڪو توهان اڳ ۾ ئي مليا آهيو، ڪنهن به شئي وٽ آهي. ٻين طريقن کان ان جو فرق اهو آهي ته اهو آهي ... ان کي ڪيئن رکڻو آهي ... تمام گهڻو دلگير. يعني، ڪنهن شئي کي تباهه ڪرڻ کان اڳ هميشه نه سڏيو ويندو آهي. پروگرامنگ هڪ خاص شيء آهي. پروگرامر ڪمپيوٽر کي ڪجهه ڪرڻ لاءِ ٻڌائي ٿو، ۽ ڪمپيوٽر اهو ڪري ٿو. توھان شايد اڳ ۾ ئي ھن رويي جي عادت آھيو، ۽ اھو توھان لاءِ پھريائين اھو خيال قبول ڪرڻ ڏکيو ٿي سگھي ٿو: ”جيئن شيون تباهه ٿي وڃن، طبقاتي finalize()طريقي کي چئبو آھي Object. يا نه سڏيو ويندو آهي. جيڪڏهن اسان خوش قسمت آهيون!" بهرحال، هي سچ آهي. جاوا مشين پاڻ اهو طئي ڪري ٿو ته finalize()هر مخصوص صورت ۾ طريقي کي ڪال ڪرڻ يا نه. مثال طور، اچو ته آزمائش لاءِ ھيٺ ڏنل ڪوڊ کي ھلائڻ جي ڪوشش ڪريون:
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 уничтожен!");
   }
}
اسان هڪ اعتراض ٺاهيندا آهيون Cat۽ ڪوڊ جي ايندڙ لائن ۾ اسان ان کي صرف ريفرنس ري سيٽ ڪيو. ۽ پوء - هڪ لک ڀيرا. اسان واضح طور تي طريقي کي ختم ڪري ڇڏيو آهي finalize()، ۽ اهو اسٽرنگ کي کنسول تي هڪ ملين ڀيرا پرنٽ ڪرڻ گهرجي، هر وقت اعتراض کي تباهه ڪرڻ کان اڳ Cat. پر نه! صحيح هجڻ لاء، اهو صرف منهنجي ڪمپيوٽر تي 37,346 ڀيرا ڀڄي ويو! اهو آهي، 27 مان صرف 1 ڪيس ۾، جاوا مشين مون نصب ڪيو، هڪ طريقو سڏڻ جو فيصلو ڪيو finalize()- ٻين ڪيسن ۾، ڪچرو گڏ ڪرڻ ان کان سواء اڳتي وڌو. هن ڪوڊ کي هلائڻ جي ڪوشش ڪريو پاڻ: گهڻو ڪري، نتيجو مختلف ٿيندو. جئين توهان ڏسي سگهو ٿا، finalize()اهو هڪ قابل اعتماد پارٽنر سڏڻ ڏکيو آهي :) تنهن ڪري، مستقبل لاء ٿورو مشورو: توهان کي finalize()ڪجهه نازڪ وسيلن کي آزاد ڪرڻ جي صورت ۾ طريقي تي ڀروسو نه ڪرڻ گهرجي. ٿي سگهي ٿو JVM ان کي سڏيندو، شايد نه. ڪير ڄاڻي؟ جيڪڏهن پنهنجي زندگيءَ دوران توهان جي اعتراض ڪجهه وسيلن تي قبضو ڪيو آهي جيڪي ڪارڪردگي لاءِ انتهائي اهم هئا، مثال طور، اهو ڊيٽابيس سان کليل ڪنيڪشن رکي ٿو، اهو بهتر آهي ته توهان جي ڪلاس ۾ هڪ خاص طريقو ٺاهيو انهن کي آزاد ڪرڻ لاءِ ۽ ان کي واضح طور تي ڪال ڪريو جڏهن اعتراض آهي. وڌيڪ ضرورت ناهي. اهو طريقو توهان کي پڪ سان معلوم ٿيندو ته توهان جي پروگرام جي ڪارڪردگي متاثر نه ٿيندي. شروع ۾ اسان چيو ته ميموري مئنيجمينٽ ۽ گندگي کي هٽائڻ تمام ضروري آهي، ۽ اهو سچ آهي. وسيلن جي غير مناسب سنڀال ۽ غير ضروري شيون گڏ ڪرڻ جي عمل کي سمجھڻ جي گھٽتائي ميموري ليڪ جي ڪري سگھي ٿي. هي سڀ کان مشهور پروگرامنگ غلطين مان هڪ آهي. پروگرامر پاران غلط لکيل ڪوڊ جي نتيجي ۾ هر دفعي نئين ٺهيل شين لاءِ نئين ميموري مختص ڪئي ويندي آهي، جڏهن ته پراڻيون، غير ضروري شيون ڪچري جي ڪليڪٽر طرفان هٽائڻ لاءِ موجود نه هونديون آهن. جيئن ته اسان هڪ روبوٽ ويڪيوم ڪلينر سان هڪ تشبيهه ٺاهي آهي، تصور ڪريو ته ڇا ٿيندو جيڪڏهن، روبوٽ شروع ڪرڻ کان اڳ، توهان گهر جي چوڌاري جراب پکيڙي ڇڏيو، هڪ شيشي جي گلدان کي ٽوڙي ڇڏيو ۽ فرش تي هڪ جدا ٿيل ليگو سيٽ ڇڏي ڇڏيو. روبوٽ، يقينا، ڪجهه ڪرڻ جي ڪوشش ڪندو، پر هڪ نقطي تي اهو پڪڙي ويندو.
اعتراض جي زندگي چڪر - 3
ان لاءِ صحيح ڪم ڪرڻ لاءِ، توهان کي فرش کي سٺي حالت ۾ رکڻو پوندو ۽ اتان کان هر شيءِ کي هٽائڻو پوندو جنهن کي ويڪيوم ڪلينر سنڀالي نٿو سگهي. ڪچرو گڏ ڪرڻ وارو ساڳيو اصول تي ڪم ڪري ٿو. جيڪڏهن پروگرام ۾ ڪيتريون ئي شيون رهجي ويون آهن ته اهو گڏ نه ٿو ڪري سگهي (جهڙوڪ روبوٽ ويڪيوم ڪلينر لاءِ ساک يا ليگو)، هڪ نقطي تي ياداشت ختم ٿي ويندي. ۽ نه رڳو اهو پروگرام جيڪو توهان لکيو آهي منجمد ٿي ويندو، پر ان وقت ڪمپيوٽر تي هلندڙ ٻيا سڀئي پروگرام پڻ. انهن لاءِ ڪافي ياداشت به نه هوندي. هي اهو آهي جيڪو آبجیکٹ لائف سائيڪل ۽ ڪچرو جمع ڪندڙ جاوا ۾ نظر اچي ٿو. هن کي ياد ڪرڻ جي ڪا ضرورت ناهي: صرف آپريشن جي اصول کي سمجھو. ايندڙ ليڪچر ۾ اسان انهن عملن جي باري ۾ وڌيڪ تفصيل سان ڳالهائينداسين، پر هن وقت توهان JavaRush مسئلن کي حل ڪرڻ لاءِ واپس اچي سگهو ٿا :) سٺي قسمت!
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION