CodeGym /Java Blog /এলোমেলো /বস্তুর জীবনচক্র
John Squirrels
লেভেল 41
San Francisco

বস্তুর জীবনচক্র

এলোমেলো দলে প্রকাশিত
ওহে! আমি মনে করি আপনি খুব অবাক হবেন না যদি আমি আপনাকে বলি যে আপনার কম্পিউটারের মেমরি সীমিত আছে :)
বস্তুর জীবনচক্র- ১
এমনকি আপনার হার্ড ড্রাইভ (যা অনেক, অনেকগুণ RAM এর আকার) আপনার প্রিয় গেম, টিভি শো এবং অন্যান্য জিনিসে পূর্ণ হতে পারে। এটি যাতে না ঘটে তার জন্য, আপনাকে আপনার কম্পিউটারের মেমরির বর্তমান অবস্থা পর্যবেক্ষণ করতে হবে এবং অপ্রয়োজনীয় ফাইলগুলি মুছে ফেলতে হবে। এই সব কিভাবে জাভা প্রোগ্রামিং এর সাথে সম্পর্কিত? একদম সরাসরি! সর্বোপরি, যে কোনো বস্তু তৈরি করলে জাভা মেশিন এর জন্য মেমরি বরাদ্দ করে । একটি বৃহৎ বাস্তব-বিশ্বের প্রোগ্রাম দশ বা কয়েক হাজার বস্তু তৈরি করে এবং তাদের প্রত্যেকের জন্য মেমরির একটি অংশ বরাদ্দ করা হয়। কিন্তু আপনি কি মনে করেন, এই বস্তুর অস্তিত্ব কত? আমাদের প্রোগ্রাম চলাকালীন তারা কি "জীবিত"? অবশ্যই না. এমনকি তাদের সমস্ত সুবিধার সাথেও, জাভা বস্তুগুলি অমর নয় :) অবজেক্টগুলির নিজস্ব জীবনচক্র রয়েছে। আজ আমরা কোড লেখা থেকে একটু বিরতি নেব এবং এই প্রক্রিয়াটি অন্বেষণ করব :) একটি প্রোগ্রাম কীভাবে কাজ করে তা বোঝার জন্য এবং সংস্থান পরিচালনার জন্য এটি খুবই গুরুত্বপূর্ণ। তাহলে, একটি বস্তুর জীবন কোথায় শুরু হয়? মানুষের মতো, জন্ম থেকেই, অর্থাৎ যখন সৃষ্টি হয়।

Cat cat = new Cat();// Our Cat object's lifecycle begins now!
প্রথমত, জাভা ভার্চুয়াল মেশিন বস্তুটি তৈরি করার জন্য প্রয়োজনীয় মেমরি বরাদ্দ করে। তারপর এটি একটি রেফারেন্স তৈরি করে (আমাদের ক্ষেত্রে, 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(), "ল্যাম্বরগিনি ডায়াবলো" গাড়ির বস্তুটি দ্বিতীয় লাইনে জীবিত থাকা বন্ধ করে দেয়। এটিতে শুধুমাত্র একটি রেফারেন্স ছিল, এবং রেফারেন্সটি নাল সেট করা হয়েছিল৷ যেহেতু ডায়াবলোতে কোনও অবশিষ্ট উল্লেখ নেই, তাই এটি "আবর্জনা" হয়ে যায়। এটি হওয়ার জন্য একটি রেফারেন্সকে শূন্যে সেট করতে হবে না:

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 Gallardoবস্তুর দিকে নির্দেশ করে, কিন্তু Lamborghini Diabloবস্তুটির কোনটি নেই। এর মানে Diabloবস্তুটি আবর্জনা হয়ে যায়। এটি যখন জাভা এর অন্তর্নির্মিত আবর্জনা সংগ্রহকারী (GC) কিক ইন করে।
বস্তুর জীবনচক্র - 2
আবর্জনা সংগ্রাহক হল একটি অভ্যন্তরীণ জাভা প্রক্রিয়া যা মেমরি মুক্ত করার জন্য দায়ী, অর্থাৎ মেমরি থেকে অপ্রয়োজনীয় বস্তু অপসারণ করা। আমরা একটি রোবট ভ্যাকুয়াম ক্লিনার দিয়ে এটি উপস্থাপন করতে বেছে নেওয়ার একটি কারণ রয়েছে৷ আবর্জনা সংগ্রাহক প্রায় একইভাবে কাজ করে: এটি পটভূমিতে আপনার প্রোগ্রামটিকে "চলবে", আবর্জনা সংগ্রহ করে। আপনাকে কার্যত এর সাথে ইন্টারঅ্যাক্ট করতে হবে না। এর কাজ হল এমন বস্তু মুছে ফেলা যা প্রোগ্রামে আর ব্যবহার করা হয় না। এইভাবে, এটি অন্যান্য বস্তুর জন্য মেমরি মুক্ত করে। আপনার কি মনে আছে যে পাঠের শুরুতে আমরা বলেছিলাম বাস্তব জীবনে আপনাকে আপনার কম্পিউটারের অবস্থা পর্যবেক্ষণ করতে হবে এবং পুরানো ফাইলগুলি মুছতে হবে? আমরা যদি জাভা অবজেক্টের কথা বলি, আবর্জনা সংগ্রহকারী আপনার জন্য এটি করে. আপনার প্রোগ্রামটি চলার সাথে সাথে আবর্জনা সংগ্রহকারীটি অনেকবার শুরু হয়: আপনাকে স্পষ্টভাবে এটিকে কল করতে হবে না এবং কমান্ড দিতে হবে না (যদিও এটি প্রযুক্তিগতভাবে সম্ভব)। আমরা পরে আবর্জনা সংগ্রহকারী সম্পর্কে আরও কথা বলব এবং এটি কীভাবে কাজ করে তা আরও বিশদে বিশ্লেষণ করব। যখন আবর্জনা সংগ্রহকারী একটি বস্তুতে পৌঁছায় - এটি ধ্বংস হওয়ার ঠিক আগে - বস্তুটির বিশেষ finalize()পদ্ধতি বলা হয়। এই পদ্ধতিটি অবজেক্ট দ্বারা ব্যবহৃত কিছু অতিরিক্ত সংস্থান প্রকাশ করার জন্য আহ্বান করা যেতে পারে। পদ্ধতিটি finalize()অবজেক্ট ক্লাসের অন্তর্গত। অন্য কথায়, এটি equals(), hashCode()এবং toString()(যা আপনি আগে পূরণ করেছেন) এর মতো। প্রতিটি বস্তুর এটি আছে । এটি অন্যান্য পদ্ধতির থেকে ভিন্ন...এটা আমরা কিভাবে বলব...এটা খুব ইচ্ছাকৃত। যে দ্বারা আমরা যে মানেএকটি বস্তু ধ্বংস হওয়ার আগে এটি সবসময় বলা হয় না । প্রোগ্রামিং একটি খুব সুনির্দিষ্ট কার্যকলাপ. প্রোগ্রামার কম্পিউটারকে কিছু করতে বলে, আর কম্পিউটার তা করে। আমি অনুমান করছি যে আপনি এই ধরণের আচরণে অভ্যস্ত হয়ে গেছেন, তাই প্রথমে আপনার জন্য নিম্নলিখিত ধারণাটি গ্রহণ করা কঠিন হতে পারে: "কোনও বস্তু ধ্বংস হওয়ার আগে, অবজেক্ট ক্লাসের পদ্ধতি বলা হয়। বা না। 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;// The first object becomes available for garbage collection here
       }
   }

   @Override
   protected void finalize() throws Throwable {
       System.out.println("The Cat is destroyed!");
   }
}
আমরা একটি Catবস্তু তৈরি করি, এবং পরের লাইনে আমরা এটির একমাত্র রেফারেন্সটি শূন্য করি। এবং আমরা এটি এক মিলিয়ন বার করি। আমরা স্পষ্টভাবে finalize()পদ্ধতি ওভাররাইড করেছি. প্রতিবার একটি Catবস্তু ধ্বংস করা হলে, এটি একটি স্ট্রিং প্রদর্শন করতে হবে - মোট এক মিলিয়ন বার। কিন্তু না! সঠিকভাবে বলতে গেলে, আমার কম্পিউটারে এটি শুধুমাত্র 37346 বার চালানো হয়েছিল! অন্য কথায়, আমার জাভা মেশিন finalize()প্রতি 27টি ক্ষেত্রে মাত্র 1টিতে পদ্ধতিটি কল করার সিদ্ধান্ত নিয়েছে। অন্যান্য ক্ষেত্রে, আবর্জনা সংগ্রহ এই কলের সাথে জড়িত ছিল না। এই কোডটি নিজে চালানোর চেষ্টা করুন। আপনি সম্ভবত একটি ভিন্ন ফলাফল পাবেন। আপনি দেখতে পাচ্ছেন, একজন নির্ভরযোগ্য অংশীদারকে কল করা কঠিন finalize():) সুতরাং, ভবিষ্যতের জন্য এখানে একটি ছোট টিপ: finalize()সমালোচনামূলক সংস্থানগুলি প্রকাশ করার পদ্ধতির উপর নির্ভর করবেন না।JVM এটি কল করতে পারে, বা এটি নাও হতে পারে। কে জানে? যদি আপনার অবজেক্টটি জীবিত থাকাকালীন কিছু কর্মক্ষমতা-সমালোচনামূলক সংস্থান (উদাহরণস্বরূপ, একটি খোলা ডাটাবেস সংযোগ) ধরে রাখে, তবে বস্তুটির আর প্রয়োজন না থাকলে সেগুলিকে ছেড়ে দেওয়ার জন্য একটি বিশেষ পদ্ধতি তৈরি করা এবং স্পষ্টভাবে কল করা ভাল। এইভাবে, আপনি নিশ্চিতভাবে জানতে পারবেন যে আপনার প্রোগ্রামের কর্মক্ষমতা ক্ষতিগ্রস্ত হবে না। আমরা এই বলে শুরু করেছি যে মেমরি এবং আবর্জনা সংগ্রহের সাথে কাজ করা খুবই গুরুত্বপূর্ণ বিষয়, এবং প্রকৃতপক্ষে সেগুলি। সম্পদের ভুল ব্যবস্থাপনা এবং অপ্রয়োজনীয় বস্তুগুলি কীভাবে পরিষ্কার করা হয় তা ভুল বোঝার ফলে সবচেয়ে অপ্রীতিকর বাগগুলির একটি হতে পারে: মেমরি লিক । এটি সবচেয়ে সুপরিচিত প্রোগ্রামিং ত্রুটিগুলির মধ্যে একটি। এমনকি এটির নিজস্ব উইকিপিডিয়া নিবন্ধ রয়েছে. খারাপভাবে লিখিত কোড এমন একটি পরিস্থিতি তৈরি করতে পারে যেখানে প্রতিবার নতুন তৈরি বস্তুর জন্য মেমরি বরাদ্দ করা হয়, কিন্তু পুরানো, অপ্রয়োজনীয় বস্তুগুলি আবর্জনা সংগ্রহের জন্য অনুপলব্ধ। যেহেতু আমরা ইতিমধ্যেই রোবট ভ্যাকুয়াম ক্লিনার সাদৃশ্য তৈরি করেছি, কল্পনা করুন যে রোবটটি চালানোর আগে আপনি যদি সারা ঘরে মোজা ছড়িয়ে দেন, একটি কাচের ফুলদানি ভেঙে দেন এবং লেগোর টুকরোগুলি পুরো মেঝেতে ফেলে দেন। স্বাভাবিকভাবেই, রোবট কিছু করার চেষ্টা করবে, কিন্তু একদিন এটি জব্দ করবে।
বস্তুর জীবনচক্র - 3
ভ্যাকুয়াম ক্লিনারটি সঠিকভাবে চালানোর জন্য, আপনাকে মেঝেটিকে শালীন আকারে রাখতে হবে এবং এটি পরিচালনা করতে পারে না এমন সমস্ত কিছু তুলতে হবে। আবর্জনা সংগ্রহকারী একই নীতি অনুসরণ করে। যদি একটি প্রোগ্রামে অনেকগুলি বস্তু থাকে যা এটি পরিষ্কার করতে পারে না (যেমন আমাদের রোবোটিক ভ্যাকুয়াম ক্লিনারের জন্য একটি সক বা লেগো), একদিন আমাদের মেমরি শেষ হয়ে যাবে। শুধু আপনার প্রোগ্রাম হ্যাং হবে না, অন্যান্য সমস্ত প্রোগ্রাম যা কম্পিউটারে চলমান হবে। সর্বোপরি, তাদের যথেষ্ট মেমরিও থাকবে না (আমাদের সাদৃশ্যে ফিরে আসা, মেঝেতে ভাঙা কাচটি কেবল ভ্যাকুয়াম ক্লিনারকেই নয়, বাড়িতে থাকা লোকদেরও থামিয়ে দেয়)। সংক্ষেপে, জাভাতে অবজেক্ট লাইফসাইকেল এবং আবর্জনা সংগ্রহের মতো দেখতে এটিই। আপনার এটি মুখস্থ করার দরকার নেই: এটি কীভাবে কাজ করে তা বোঝার জন্য এটি যথেষ্ট। পরবর্তী পাঠে, আমরা ' আরও বিস্তারিতভাবে এই প্রক্রিয়াগুলিতে ফিরে আসব। কিন্তু আপাতত, আপনি CodeGym কাজগুলি সমাধানে ফিরে আসতে পারেন :) শুভকামনা!
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION