কম্পিউটার

আবর্জনা সংগ্রহের ভূমিকা (২য় খণ্ড)

রুবি ম্যাজিকের আগের পর্বে আমরা কেন গারবেজ কালেকশন (জিসি) প্রয়োজন এবং এটি সাধারণভাবে কীভাবে কাজ করে তা নিয়ে কথা বলেছিলাম। এই পোস্টে আমরা রুবিতে এটি কীভাবে প্রয়োগ করা হয় সে সম্পর্কে একটু গভীরে ডুব দেব।

ভিন্ন রুবি বাস্তবায়ন

রুবি বাস্তবায়নের একটি সংখ্যা আছে. তিনটি জনপ্রিয় হল:এমআরআই (ম্যাটজের রুবি ইন্টারপ্রেটার), রুবিনিয়াস এবং জেরুবি। বিভিন্ন রুবি বাস্তবায়ন GC এর বিভিন্ন পদ্ধতি ব্যবহার করে। এই নিবন্ধে আমরা এমআরআই-এর উপর ফোকাস করব, যা বেশিরভাগ রুবি ডেভেলপাররা ব্যবহার করেন।

রুবির স্তূপ

একটি কম্পিউটারে দুই ধরনের মেমরি থাকে:স্ট্যাক এবং হিপ। স্ট্যাকটি খুব দ্রুত এবং একটি ফাংশন কলের প্রসঙ্গে স্থানীয়। এর মানে হল যে স্ট্যাকে ঘোষিত প্রতিটি ভেরিয়েবল ফাংশনটি সম্পন্ন হওয়ার সাথে সাথেই মুক্ত হয়ে যায়। স্ট্যাকটি আকারে খুব সীমিত, তাই আপনি বড় বস্তু সংরক্ষণ করতে পারবেন না যাতে একটি ছবি বা ফাইলের ডেটা থাকে।

এটি রুবি বস্তু সংরক্ষণের জন্য একটি খারাপ ফিট. এই বস্তুগুলি প্রায়শই একটি পদ্ধতি কলের চেয়ে বেশি সময় ধরে থাকে। এছাড়াও, স্ট্যাকের জন্য একটি বস্তু খুব বড় হবে কিনা তা অনুমান করা প্রায় অসম্ভব।

তাই রুবি অন্য ধরনের মেমরি ব্যবহার করে:গাদা। স্তুপে একটি প্রোগ্রাম কিছু মেমরি দাবি করতে পারে এবং সেই মেমরির সাথে সম্পন্ন হলে পরিষ্কারের জন্য দায়ী। রুবি রুবি বস্তু সংরক্ষণ করতে ব্যবহার করার জন্য মেমরির একটি একক স্ল্যাব দাবি করে এটি ব্যবহার করে। এটিকে রুবির স্তূপ বলা হয়।

স্ট্যাক এবং হিপ সারাংশ
স্ট্যাক মেমরি খুব দ্রুত
ব্যবহৃত মেমরি স্বয়ংক্রিয়ভাবে মুক্ত হয় যখন ফাংশন কল শেষ হয়
আকারে খুব সীমিত
হিপ মেমরি স্ট্যাকের চেয়ে কিছুটা ধীর
কোন স্বয়ংক্রিয় ক্লিনআপ নেই
আকার শুধুমাত্র কম্পিউটারের উপলব্ধ মেমরি দ্বারা সীমাবদ্ধ

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

মার্ক এবং সুইপ

এমআরআই মার্ক এবং সুইপ নামে একটি জিসি অ্যালগরিদম ব্যবহার করে। এটি প্রথমে একটি মার্ক ফেজ করে কাজ করে। মার্ক ফেজে আবর্জনা সংগ্রাহক বর্তমানে বিদ্যমান সমস্ত বস্তু স্ক্যান করে এবং প্রতিটি বস্তুর উপর একটি চিহ্নিত পতাকা সেট করে যা বিশ্বাস করে যে এটি পরিষ্কার করা যেতে পারে।

মার্ক ফেজ আপনার কোড কার্যকর করা বন্ধ করে দেয়। এর কারণ হল যে আবর্জনা সংগ্রাহককে বিদ্যমান বস্তুর মধ্যে সমস্ত সম্পর্ক বুঝতে হবে। যদি প্রোগ্রামটি মার্ক প্রক্রিয়া চলাকালীন চলতে থাকে তবে এর মধ্যে জিনিসগুলি পরিবর্তন হতে পারে এবং গারবেজ কালেক্টর একটি বস্তুর বর্তমান অবস্থা কী তা নিশ্চিত হতে পারে না৷

দ্বিতীয়ত ঝাড়ু পর্ব শুরু হয়। এটি রুবি 1.9 এবং তার উপরে পটভূমিতে চলে। আবর্জনা সংগ্রাহক নিঃশব্দে চিহ্ন পর্যায়ে চিহ্নিত প্রতিটি বস্তুকে মুক্ত করে। ঝাড়ু দেওয়ার পরেই মেমরি আবার পাওয়া যায়।

যেহেতু মার্ক ফেজ আপনার কোডের এক্সিকিউশনকে থামিয়ে দেয়, তাই উৎপাদনে সমস্যা হতে পারে। ঝাড়ু পর্যায় তুলনামূলকভাবে সৌম্য।

মার্ক এবং সুইপ সারাংশ
ফেজ চিহ্নিত করুন বিদ্যমান অবজেক্ট স্ক্যান করে
অবজেক্ট পরিষ্কার করা গেলে চিহ্নিত ফ্ল্যাগ সেট করে
কোড এক্সিকিউশন বন্ধ করে
সুইপ পর্ব ব্যাকগ্রাউন্ডে চলে
চিহ্নিত বস্তুগুলি পরিষ্কার করে
সুইপ প্রতিযোগিতার পরে মেমরি আবার উপলব্ধ হয়

মেজর এবং মাইনর GC রান

রুবি 2.1+ এ গারবেজ কালেক্টর বড় এবং ছোট রান করে। এটি কোন বস্তু নতুন তা ট্র্যাক রাখে। যদি একটি বস্তু কয়েকটি জিসি রান করে বেঁচে থাকে তবে এটি পুরানো হিসাবে চিহ্নিত করা হয়। পুরানো বস্তুগুলি তখন ছোট রানে উপেক্ষা করা হয়। এটি নাবালককে অনেক কম অনুপ্রবেশকারী করে তোলে কারণ গারবেজ কালেক্টরকে শুধুমাত্র সেই বস্তুগুলি স্ক্যান করতে হয় যেগুলি সবেমাত্র বরাদ্দ করা হয়েছে৷

এটি দরকারী কারণ প্রায়শই আপনার স্মৃতির একটি অংশ কখনই পরিষ্কার করা উচিত নয়। আপনি যখন Rails বুট করেন তখন এটি পুরো রেল ফ্রেমওয়ার্ককে মেমরিতে লোড করে। এটি সারাজীবনের জন্য সেখানে থাকবে, তাই প্রতিবার এই সমস্ত বস্তুগুলি পরীক্ষা করা সম্পদের অপচয় হবে৷

প্রধান এবং ছোট রান
প্রধান রান কম দৌড়ায়
চালানোর জন্য আরও নিবিড়
ছোট দৌড় পুরানো বস্তু উপেক্ষা করে
অনেকবার চালায়
চালাতে কম অনুপ্রবেশকারী

যারা আরও গভীরে যেতে চান তাদের জন্য

আমরা আমান গুপ্তের দুর্দান্ত ব্লগ থেকে এই সম্পর্কে অনেক কিছু শিখেছি। আপনি যদি এই বিষয়ে আরও গভীরে যেতে চান তবে তা পরীক্ষা করে দেখুন৷

পরবর্তী:ব্যবহারিক আবর্জনা সংগ্রহ টিউনিং

আবর্জনা সংগ্রাহক কীভাবে কাজ করে তা টিউন করতে আপনি পরিমাপ করতে পারেন এবং কনফিগারেশন পরিবর্তন করতে পারেন এমন অনেকগুলি মেট্রিক রয়েছে। এই GC সিরিজের পরবর্তী কিস্তিতে আমরা এই মেট্রিক্স এবং কনফিগারেশন প্যারামিটার নিয়ে আলোচনা করব।


  1. রুবিতে নিউরাল নেটওয়ার্ক:একটি এত ভীতিকর ভূমিকা নয়

  2. রুবিতে একটি প্রোগ্রামিং ভাষা তৈরি করা:দ্য ইন্টারপ্রেটার, পার্ট 2

  3. TCmalloc-এর সাথে রুবির মেমরি বরাদ্দের প্রোফাইলিং

  4. রুবি ইন্টারনাল:রুবি অবজেক্টের মেমরি লেআউট অন্বেষণ করা