CodeGym /Java Blog /এলোমেলো /আবর্জনা সংগ্রহকারী সম্পর্কে আরো
John Squirrels
লেভেল 41
San Francisco

আবর্জনা সংগ্রহকারী সম্পর্কে আরো

এলোমেলো দলে প্রকাশিত
ওহে! শেষ পাঠে, আমরা প্রথমে জাভা এর অন্তর্নির্মিত আবর্জনা সংগ্রহকারীর সাথে পরিচিত হয়েছি এবং এটি কীভাবে কাজ করে তার মোটামুটি ধারণা পেয়েছি। আপনার প্রোগ্রাম চলাকালীন এটি ব্যাকগ্রাউন্ডে কাজ করে, অপ্রয়োজনীয় বস্তু সংগ্রহ করে যা পরে মুছে ফেলা হবে। এইভাবে, এটি মেমরি মুক্ত করে যা ভবিষ্যতে নতুন বস্তু তৈরি করতে ব্যবহার করা যেতে পারে।
আবর্জনা সংগ্রহকারী সম্পর্কে আরও - ১
এই পাঠে, আমরা এটি কীভাবে কাজ করে তা আরও বিশদে আলোচনা করব। যেমন, কিভাবে এবং কখন কোন বস্তু অপ্রয়োজনীয় হয়ে পড়ে? এবং আবর্জনা সংগ্রহকারী কিভাবে খুঁজে বের করে? এই প্রশ্নগুলি আমরা আজকের পাঠের সময় উত্তর দেব :) পাঠটি একটি সংক্ষিপ্ত বিবরণের মতো হবে: আপনাকে এই উপাদানটি হৃদয় দিয়ে শিখতে হবে না। উদ্দেশ্য হল মেমরি এবং আবর্জনা সংগ্রহকারী কীভাবে কাজ করে সে সম্পর্কে আপনার দৃষ্টিভঙ্গি প্রসারিত করা, তাই শুধু পড়ুন এবং নিজের জন্য নতুন কিছু খুঁজুন :) চলুন! প্রথম জিনিসটি আপনাকে মনে রাখতে হবে যে আবর্জনা সংগ্রহকারী আপনার প্রোগ্রামের সাথে সমান্তরালভাবে কাজ করে. এটা আপনার প্রোগ্রামের অংশ নয়। এটি আলাদাভাবে চলে (শেষ পাঠে, আমরা এটিকে একটি রোবট ভ্যাকুয়াম ক্লিনারের সাথে তুলনা করেছি) কিন্তু এটি সবসময় এমন ছিল না। আপনার প্রোগ্রামের মতো একই থ্রেডে আবর্জনা সংগ্রহ করা হতো। কিছু সময়সূচীতে (প্রতি কয়েক মিনিটে একবার), আবর্জনা সংগ্রহকারী প্রোগ্রামে অবাঞ্ছিত বস্তুর উপস্থিতি পরীক্ষা করবে। সমস্যাটি ছিল এই চেক এবং আবর্জনা সংগ্রহের সময় প্রোগ্রামটি হ্যাং হবে (চালিত হবে না)। কল্পনা করুন আপনি আপনার অফিসে কর্মস্থলে বসে আছেন। কিন্তু তারপর পরিচ্ছন্নতাকারী মহিলা মেঝে ধোয়ার জন্য আসে। সে আপনাকে আপনার কম্পিউটার থেকে 5 মিনিটের জন্য দূরে সরিয়ে দেয় এবং আপনি তার পরিষ্কার করা শেষ না হওয়া পর্যন্ত অপেক্ষা করুন। এই সময়ের মধ্যে, আপনি কাজ করতে অক্ষম। আবর্জনা সংগ্রহ কীভাবে কাজ করত সে সম্পর্কে :) এই প্রক্রিয়াটি পরে পরিবর্তিত হয়েছিল, এবং এখন আবর্জনা সংগ্রহকারী ব্যাকগ্রাউন্ডে চলে, প্রোগ্রামের কাজ নিজেই বাধা না. আপনি ইতিমধ্যেই জানেন যে একটি বস্তু মারা যায় যখন তার আর রেফারেন্স থাকে না। বাস্তবে,আবর্জনা সংগ্রাহক বস্তুর উল্লেখ গণনা করে না । প্রথমত, এটি একটি দীর্ঘ সময় নিতে পারে. দ্বিতীয়ত, এটি খুব কার্যকর নয়। সব পরে, বস্তু একে অপরের উল্লেখ করতে পারেন! আবর্জনা সংগ্রহকারী সম্পর্কে আরও - 2চিত্রটি একটি উদাহরণ দেখায় যেখানে 3টি বস্তু একে অপরকে উল্লেখ করে, কিন্তু অন্য কেউ তাদের উল্লেখ করে না। অন্য কথায়, বাকি প্রোগ্রামের তাদের প্রয়োজন নেই। যদি আবর্জনা সংগ্রাহক কেবল রেফারেন্সগুলি গণনা করে তবে এই 3টি বস্তু সংগ্রহ করা হবে না এবং মেমরিটি মুক্ত করা হবে না (সেগুলির রেফারেন্স রয়েছে!) আমরা এটিকে একটি মহাকাশযানের সাথে তুলনা করতে পারি। ফ্লাইটের সময়, মহাকাশচারীরা মেরামতের জন্য উপলব্ধ খুচরা যন্ত্রাংশের তালিকা পরীক্ষা করার সিদ্ধান্ত নেন। অন্যান্য জিনিসের মধ্যে, তারা একটি সাধারণ গাড়ি থেকে একটি স্টিয়ারিং হুইল এবং প্যাডেল খুঁজে পায়। স্পষ্টতই, তাদের এখানে প্রয়োজন নেই এবং অপ্রয়োজনীয়ভাবে স্থান নিচ্ছে (যদিও এই দুটি অংশ একে অপরের সাথে সম্পর্কিত এবং কিছু ফাংশন রয়েছে)। কিন্তু মহাকাশযানের ভিতরে, এগুলি অকেজো আবর্জনা যা ফেলে দেওয়া উচিত। তদনুসারে, জাভাতে, রেফারেন্স গণনার ভিত্তিতে নয় আবর্জনা সংগ্রহের সিদ্ধান্ত নেওয়া হয়েছিল,নাগালযোগ্য এবং অগম্য । একটি বস্তু পৌঁছানো যায় কিনা তা আমরা কিভাবে নির্ধারণ করব? এটা সব সহজভাবে বুদ্ধিমান. একটি বস্তু পৌঁছানো যায় যদি এটি অন্য একটি পৌঁছানোর যোগ্য বস্তু দ্বারা উল্লেখ করা হয়। এইভাবে, আমরা একটি "নাগালের চেইন" পাই। এটি শুরু হয় যখন প্রোগ্রাম শুরু হয় এবং প্রোগ্রামের সময়কাল ধরে চলতে থাকে। এটি দেখতে এরকম কিছু: আবর্জনা সংগ্রহকারী সম্পর্কে আরও - 3 চিত্রের তীরটি আমাদের প্রোগ্রামের এক্সিকিউটেবল কোড নির্দেশ করে। কোড (উদাহরণস্বরূপ, main()পদ্ধতি) বস্তুর রেফারেন্স তৈরি করে। এই বস্তুগুলি অন্যান্য বস্তুর উল্লেখ করতে পারে, সেই বস্তুগুলি স্থির অন্যদের, ইত্যাদি। এটি একটি রেফারেন্স চেইন গঠন করে. আপনি যদি একটি বস্তু থেকে "রুট রেফারেন্স" (একটি সরাসরি এক্সিকিউটেবল কোডে তৈরি) থেকে চেইন বরাবর ট্রেস করতে পারেন, তাহলে এটি পৌঁছানোর যোগ্য বলে বিবেচিত হয়। এই ধরনের বস্তু ছবিতে কালো চিহ্নিত করা হয়. কিন্তু বস্তুটি যদি এই চেইনের বাইরে চলে যায় তাহলে কোনো বস্তুর কাছে পৌঁছানো যায় না, অর্থাৎ বর্তমানে যে কোডটি কার্যকর করা হচ্ছে তার কোনো ভেরিয়েবলই এটিকে উল্লেখ করে না এবং এটি "রেফারেন্স চেইনের" মাধ্যমে পৌঁছানো যায় না। আমাদের প্রোগ্রামে, এই জাতীয় দুটি বস্তুকে লাল চিহ্নিত করা হয়েছে। মনে রাখবেন যে এই "লাল" বস্তুগুলির একে অপরের উল্লেখ রয়েছে। কিন্তু আমরা আগেই বলেছি, জাভার আধুনিক আবর্জনা সংগ্রহকারী রেফারেন্স গণনা করে না। এটি নির্ধারণ করে যে কোনও বস্তু পৌঁছানো যায় বা অপাগ্য কিনা. ফলস্বরূপ, এটি চিত্রের দুটি লাল বস্তুর উপর জব্দ করবে। এখন শুরু থেকে শেষ পর্যন্ত পুরো প্রক্রিয়াটি দেখা যাক। এটি করার সময়, আমরা জাভাতে মেমরি কীভাবে সাজানো হয় তাও দেখব :) সমস্ত জাভা অবজেক্ট মেমরির একটি বিশেষ অঞ্চলে সংরক্ষণ করা হয় যাকে হেপ বলা হয় । দৈনন্দিন ভাষায়, একটি স্তূপ সাধারণত আইটেমগুলির একটি পাহাড়, যেখানে সবকিছু মিশ্রিত হয়। কিন্তু যে গাদা জাভা কি না. এর গঠন খুবই যৌক্তিক এবং যুক্তিসঙ্গত। কিছু সময়ে, জাভা প্রোগ্রামাররা দেখতে পান যে তাদের সমস্ত বস্তুকে দুই প্রকারে বিভক্ত করা যেতে পারে: সাধারণ বস্তু এবং "দীর্ঘজীবী বস্তু". "দীর্ঘজীবী বস্তু" হল এমন বস্তু যা বহু রাউন্ডের আবর্জনা সংগ্রহের মধ্যে টিকে আছে। তারা সাধারণত প্রোগ্রাম শেষ না হওয়া পর্যন্ত বেঁচে থাকে। শেষ পর্যন্ত, সম্পূর্ণ গাদা, যেখানে সমস্ত বস্তু সংরক্ষণ করা হয়, কয়েকটি অংশে বিভক্ত ছিল। প্রথম অংশের একটি সুন্দর নাম রয়েছে: ইডেন(বাইবেলের "গার্ডেন অফ ইডেন" থেকে)। এই নামটি উপযুক্ত, কারণ এখানেই বস্তুগুলি তৈরি হওয়ার পরে শেষ হয়। এটি মেমরির সেই অংশ যেখানে আমরা নতুন কীওয়ার্ড ব্যবহার করলে নতুন বস্তু তৈরি হয়। অনেক বস্তু তৈরি হতে পারে। যখন এই এলাকায় স্থান ফুরিয়ে যায়, তখন একটি প্রাথমিক "দ্রুত" আবর্জনা সংগ্রহ শুরু হয়। আমাদের অবশ্যই বলতে হবে যে আবর্জনা সংগ্রহকারী খুব চালাক। এটি একটি অ্যালগরিদম বেছে নেয় যে স্তূপে আরও আবর্জনা আছে বা আরও জীবন্ত বস্তু আছে কিনা। যদি প্রায় সমস্ত বস্তুই আবর্জনা হয়, তাহলে সংগ্রাহক জীবন্ত বস্তুগুলিকে চিহ্নিত করে মেমরির অন্য এলাকায় নিয়ে যায়। তারপর বর্তমান এলাকা সম্পূর্ণরূপে পরিষ্কার করা হয়। যদি প্রচুর আবর্জনা না থাকে, এবং স্তূপটি বেশিরভাগ জীবন্ত বস্তুর হয়, তাহলে সংগ্রাহক আবর্জনাটিকে চিহ্নিত করে, পরিষ্কার করে এবং অন্যান্য বস্তুগুলিকে একসাথে প্যাক করে। আমরা বলেছি "একটি বেঁচে থাকার স্থানএকটি বেঁচে থাকার স্থান , ঘুরে, প্রজন্মের মধ্যে বিভক্ত করা হয় । প্রতিটি বস্তু একটি নির্দিষ্ট প্রজন্মের অন্তর্গত, এটি কত রাউন্ড আবর্জনা সংগ্রহ করে বেঁচে আছে তার উপর নির্ভর করে। যদি কোনো বস্তু এক রাউন্ডের আবর্জনা সংগ্রহ থেকে বেঁচে থাকে, তাহলে সেটি "প্রজন্ম 1" এ রয়েছে; যদি 5 হয়, তাহলে "জেনারেশন 5"। একসাথে, ইডেন এবং একটি বেঁচে থাকার স্থান তরুণ প্রজন্ম নামে একটি এলাকা গঠন করে । তরুণ প্রজন্ম ছাড়াও, গাদা স্মৃতির আরেকটি ক্ষেত্র রয়েছে যাকে বলা হয় পুরানো প্রজন্ম. এটি ঠিক সেই এলাকা যেখানে দীর্ঘজীবী বস্তুগুলি যা অনেক রাউন্ডের আবর্জনা সংগ্রহের মধ্যে টিকে আছে। তাদের অন্য সব থেকে আলাদা রাখার সুবিধা রয়েছে। পুরো আবর্জনা সংগ্রহ শুধুমাত্র তখনই সঞ্চালিত হয় যখন পুরানো প্রজন্ম পূর্ণ হয়, অর্থাৎ প্রোগ্রামে এত দীর্ঘস্থায়ী বস্তু রয়েছে যে যথেষ্ট মেমরি নেই। এই প্রক্রিয়ায় মেমরির একাধিক ক্ষেত্র জড়িত। সাধারণভাবে, এটি জাভা মেশিন দ্বারা তৈরি সমস্ত বস্তু জড়িত। স্বাভাবিকভাবেই, এটি অনেক বেশি সময় এবং সংস্থান নেয়। দীর্ঘজীবী বস্তুগুলিকে আলাদাভাবে সংরক্ষণ করার জন্য এই অবিকল সিদ্ধান্ত নেওয়া হয়েছিল। অন্যান্য এলাকায় স্থান ফুরিয়ে গেলে "দ্রুত আবর্জনা সংগ্রহ" করা হয়। এটি শুধুমাত্র একটি এলাকা জড়িত, যা এটি দ্রুত এবং আরো দক্ষ করে তোলে। অবশেষে, যখন দীর্ঘজীবী বস্তুর জন্য এলাকা সম্পূর্ণরূপে পূর্ণ হয়, সম্পূর্ণ আবর্জনা সংগ্রহ শুরু হয়। এইভাবে, সংগ্রাহক "সবচেয়ে ভারী" টুল ব্যবহার করেন যখন এটি এড়ানো অসম্ভব। এখানে স্তূপ গঠন এবং আবর্জনা সংগ্রহের একটি ভিজ্যুয়াল উপস্থাপনা রয়েছে: আবর্জনা সংগ্রহকারী সম্পর্কে আরও - 4
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION