"হাই! আমি আপনাকে আবর্জনা সংগ্রহ সম্পর্কে আরেকটি ছোট পাঠ দেওয়ার সিদ্ধান্ত নিয়েছি।"

আপনি ইতিমধ্যেই জানেন, জাভা মেশিন নিজেই পর্যবেক্ষণ করে যখন কোন বস্তু অপ্রয়োজনীয় হয়ে যায় এবং মুছে দেয়।

"হ্যাঁ। তুমি আর ঋষি আমাকে আগে বলেছিলে। বিস্তারিত মনে নেই।"

"ঠিক আছে. তারপর আবার এটার উপর যাওয়া যাক।"

আবর্জনা সংগ্রহ- ১টি

"একটি অবজেক্ট তৈরি হওয়ার সাথে সাথে, JVM এটির জন্য মেমরি বরাদ্দ করে। রেফারেন্স ভেরিয়েবল ব্যবহার করে অবজেক্টের আগ্রহ পর্যবেক্ষণ করা হয়।  আবর্জনা সংগ্রহের সময় একটি বস্তু মুছে ফেলা যেতে পারে, অর্থাৎ যে পদ্ধতির মাধ্যমে মেমরি রিলিজ করা হয় যদি কোন ভেরিয়েবলের উল্লেখ না থাকে। বস্তু। "

"আবর্জনা সংগ্রহকারী সম্পর্কে আমাকে একটু বলুন - এটি কী এবং এটি কীভাবে কাজ করে।"

"ঠিক আছে। আবর্জনা সংগ্রহ প্রধান থ্রেডে ঘটত। প্রতি 5 মিনিটে, বা আরও প্রায়ই। যদি পর্যাপ্ত ফ্রি মেমরি না থাকে, তাহলে জাভা মেশিন সমস্ত থ্রেড সাসপেন্ড করবে এবং অব্যবহৃত বস্তু মুছে ফেলবে।"

"কিন্তু এই পদ্ধতিটি এখন পরিত্যাগ করা হয়েছে। পরবর্তী প্রজন্মের আবর্জনা সংগ্রহকারী পর্দার আড়ালে এবং একটি পৃথক থ্রেডে কাজ করে। একে বলা হয় সমবর্তী আবর্জনা সংগ্রহ।"

"আমি দেখছি। একটি বস্তু মুছে ফেলা বা না করা ঠিক কিভাবে সিদ্ধান্ত হয়?"

"শুধুমাত্র একটি বস্তুর রেফারেন্সের সংখ্যা গণনা করা খুব কার্যকর নয় - এমন বস্তু থাকতে পারে যা একে অপরকে উল্লেখ করে, কিন্তু অন্য কোন বস্তু দ্বারা উল্লেখ করা হয় না।"

"সুতরাং জাভা একটি ভিন্ন পদ্ধতি অবলম্বন করে।  জাভা অবজেক্টকে নাগালযোগ্য এবং অপ্রাপ্তিতে বিভক্ত করে।  একটি বস্তু পৌঁছানো যায় (জীবিত) যদি এটি অন্য একটি পৌঁছানো যায় এমন (জীবন্ত) বস্তুর দ্বারা উল্লেখ করা হয়। নাগালযোগ্যতা থ্রেড থেকে নির্ধারিত হয়। চলমান থ্রেডগুলি সর্বদা পৌঁছানোর যোগ্য (জীবন্ত) হিসাবে বিবেচিত হয়। , এমনকি যদি কেউ তাদের উল্লেখ না করে।"

"ঠিক আছে। আমি মনে করি আমি বুঝতে পেরেছি।"

"প্রকৃত আবর্জনা সংগ্রহ কিভাবে ঘটে - অপ্রয়োজনীয় বস্তু মুছে ফেলা?"

"এটি সহজ। জাভাতে, মেমরিকে নিয়ম অনুসারে দুটি ভাগে ভাগ করা হয়, এবং যখন এটি আবর্জনা সংগ্রহের সময় হয়, তখন সমস্ত জীবন্ত (নাগালযোগ্য) বস্তুগুলি মেমরির অন্য অংশে অনুলিপি করা হয়, এবং পুরানো স্মৃতি সব ছেড়ে দেওয়া হয়।"

"এটি একটি আকর্ষণীয় পদ্ধতি। রেফারেন্স গণনা করার দরকার নেই: সমস্ত পৌঁছানো যায় এমন বস্তুর অনুলিপি করুন, এবং বাকি সবকিছুই আবর্জনা।"

"এটি তার চেয়ে একটু বেশি জটিল। জাভা প্রোগ্রামাররা দেখেছেন যে বস্তুগুলি সাধারণত দুটি বিভাগে বিভক্ত হয়: দীর্ঘস্থায়ী (যা প্রোগ্রামটি চলার পুরো সময়ই থাকে) এবং স্বল্পস্থায়ী (যা পদ্ধতিতে এবং সম্পাদনের জন্য প্রয়োজন হয় "স্থানীয়" » অপারেশন)।"

"দীর্ঘজীবী বস্তুগুলিকে স্বল্পস্থায়ী বস্তুগুলি থেকে আলাদা রাখা অনেক বেশি কার্যকর। এটি করার জন্য, বস্তুর দীর্ঘায়ু নির্ধারণের একটি উপায় নিয়ে আসা প্রয়োজন ছিল।"

"সুতরাং, তারা সমস্ত মেমরিকে "প্রজন্ম" এ বিভক্ত করেছে। সেখানে প্রথম প্রজন্মের বস্তু, দ্বিতীয় প্রজন্মের বস্তু ইত্যাদি রয়েছে। প্রতিবার মেমরি সাফ করার সময়, প্রজন্মের কাউন্টারটি 1 দ্বারা বৃদ্ধি পায়। যদি নির্দিষ্ট বস্তু একাধিক প্রজন্মে বিদ্যমান থাকে, তাহলে তারা দীর্ঘজীবী হিসাবে রেকর্ড করা হয়।"

"আজকে, আবর্জনা সংগ্রহকারী জাভার একটি অত্যন্ত জটিল এবং দক্ষ অংশ। এর অনেক অংশ হিউরিস্টিকভাবে কাজ করে - অ্যালগরিদমের উপর ভিত্তি করে যা অনুমান করে। ফলস্বরূপ, এটি প্রায়শই ব্যবহারকারীর কথা শোনে না।"

"মানে?"

"জাভাতে একটি আবর্জনা সংগ্রহকারী ( GC ) অবজেক্ট রয়েছে যা System.gc () পদ্ধতি ব্যবহার করে কল করা যেতে পারে।"

"আপনি System.runFinalization() ব্যবহার করতে পারেন যাতে কলগুলিকে মুছে ফেলার জন্য অবজেক্টের চূড়ান্ত পদ্ধতিতে বাধ্য করা যায়৷ কিন্তু আসল বিষয়টি হল যে, জাভা ডকুমেন্টেশন অনুসারে, এই গ্যারান্টি না যে আবর্জনা সংগ্রহ শুরু হবে, না চূড়ান্ত করা হবে( ) পদ্ধতি বলা হবে।  আবর্জনা সংগ্রহকারী সিদ্ধান্ত নেয় কখন এটি কল করবে এবং কিসের উপর

"ওহ! জেনে ভালো লাগলো।"

"কিন্তু আরও কিছু আছে। আপনি জানেন, জাভাতে, কিছু বস্তু অন্যদের উল্লেখ করে। রেফারেন্সের এই নেটওয়ার্কটি একটি বস্তু মুছে ফেলা উচিত কিনা তা নির্ধারণ করতে ব্যবহৃত হয়।"

"এবং, দেখুন। জাভাতে বিশেষ রেফারেন্স রয়েছে যা আপনাকে এই প্রক্রিয়াটিকে প্রভাবিত করতে দেয়। তাদের জন্য বিশেষ র্যাপার ক্লাস রয়েছে। এখানে সেগুলি হল:"

" সফটরেফারেন্স  একটি নরম রেফারেন্স।"

" দুর্বল রেফারেন্স  একটি দুর্বল রেফারেন্স।"

" ফ্যান্টম রেফারেন্স একটি ফ্যান্টম রেফারেন্স।"

"উহ... এটি আমাকে অভ্যন্তরীণ ক্লাস, নেস্টেড ক্লাস, নেস্টেড বেনামী ক্লাস এবং স্থানীয় ক্লাসের কথা মনে করিয়ে দেয়। নামগুলি আলাদা, কিন্তু তারা কিসের জন্য তা মোটেও পরিষ্কার নয়।"

"বলুন, অ্যামিগো, আপনি একজন প্রোগ্রামার হয়ে গেছেন। এখন আপনি ক্লাসের নামের কারণে রাগান্বিত হয়ে বলছেন, "এগুলি যথেষ্ট তথ্যপূর্ণ নয়, এবং এই ক্লাসটি কী করে, কীভাবে, তা নির্ধারণ করা এক নামে(!) দিয়ে অসম্ভব। এবং কেন"."

"বাহ। আমি খেয়ালও করিনি। কিন্তু এটা খুব স্পষ্ট।"

"ঠিক আছে। যথেষ্ট শব্দ। আমাকে SoftReferences সম্পর্কে বলতে দিন।"

"এই রেফারেন্সগুলি বিশেষভাবে ক্যাশে করার জন্য ডিজাইন করা হয়েছিল, যদিও সেগুলি অন্যান্য উদ্দেশ্যে ব্যবহার করা যেতে পারে - সমস্ত প্রোগ্রামারের বিবেচনার ভিত্তিতে।"

"এরকম একটি রেফারেন্সের উদাহরণ এখানে:"

উদাহরণ
// Create a Cat object
Cat cat = new Cat();

// Create a soft reference to a Cat object
SoftReference<Cat> catRef = new SoftReference<Cat>(cat);

// Now only the catRef soft reference points at the object
cat = null;

// Now the ordinary cat variable also references the object
cat = catRef.get();

// Clear the soft reference
catRef.clear();

"যদি একটি বস্তুর শুধুমাত্র উল্লেখগুলি নরম হয়, তবে এটি চলতে থাকে এবং 'নরমভাবে-পৌঁছানো' বলা হয়।"

"কিন্তু!  প্রোগ্রামের পর্যাপ্ত মেমরি না থাকলে শুধুমাত্র সফট রেফারেন্স দ্বারা উল্লেখ করা একটি বস্তু আবর্জনা সংগ্রাহক মুছে ফেলতে পারে।  যদি হঠাৎ করে প্রোগ্রামটির যথেষ্ট মেমরি না থাকে, তাহলে OutOfMemoryException নিক্ষেপ করার আগে , আবর্জনা সংগ্রাহক সমস্ত বস্তু মুছে ফেলবে। নরম রেফারেন্স দ্বারা উল্লেখ করা হয়েছে এবং প্রোগ্রামে মেমরি বরাদ্দ করার জন্য আবার চেষ্টা করবে।"

"ধরুন একটি ক্লায়েন্ট প্রোগ্রাম ঘন ঘন একটি সার্ভার প্রোগ্রাম থেকে বিভিন্ন তথ্য অনুরোধ করে। সার্ভার প্রোগ্রাম একটি SoftReference ব্যবহার করে এটির কিছু ক্যাশে করতে পারে। যদি নরম রেফারেন্সের দ্বারা মৃত্যু থেকে রাখা বস্তুগুলি মেমরির একটি বড় অংশ নেয়, তাহলে আবর্জনা সংগ্রাহক কেবল সেগুলিকে মুছে ফেলে। সব। এটা সুন্দর!"

"হ্যাঁ। আমি নিজেই এটা পছন্দ করেছি।"

"আচ্ছা, একটি ছোট সংযোজন: SoftReference ক্লাসে দুটি পদ্ধতি রয়েছে। get() পদ্ধতিটি SoftReference দ্বারা উল্লেখ করা বস্তুকে ফেরত দেয় । যদি বস্তুটি আবর্জনা সংগ্রাহক দ্বারা মুছে ফেলা হয়, তাহলে get () পদ্ধতিটি হঠাৎ শূন্য হতে শুরু করবে।"

"ব্যবহারকারী পরিষ্কার() পদ্ধতিতে কল করে স্পষ্টভাবে SoftReference সাফ করতে পারে । এই ক্ষেত্রে, SoftReference অবজেক্টের ভিতরের দুর্বল লিঙ্কটি ধ্বংস হয়ে যাবে।"

"এখন এ পর্যন্তই."

"আকর্ষণীয় গল্পের জন্য ধন্যবাদ, এলি। এটা সত্যিই খুব আকর্ষণীয় ছিল।"