কেন আবর্জনা সংগ্রহ কেবল স্তূপ জড়ো করে?


28

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

এটি কেন ডেটা বিভাগ (গ্লোবাল, ধ্রুবক ইত্যাদি) বা স্ট্যাকের পাশাপাশি পরীক্ষা করে না? এটি হ'ল এটি কী জিনিস যে আমরা কেবল আবর্জনা সংগ্রহ করতে চাই?


21
"ঝাঁকুনি দড়ি" "স্ট্যাক হ্যাক" এর চেয়েও নিরাপদ ... :-)
ব্রায়ান নোব্লাচ

উত্তর:


62

আবর্জনা সংগ্রাহক করে কি গাদা জিনিস বর্তমানে জিনিসপত্রের দ্বারা ব্যবহার করা হচ্ছে (পয়েন্টযুক্ত) স্ট্যাক দেখতে - স্ট্যাক স্ক্যান।

আবর্জনা সংগ্রহকারীকে স্ট্যাক মেমরি সংগ্রহ করার বিষয়টি বিবেচনা করার কোনও অর্থ নেই কারণ স্ট্যাকটি সেভাবে পরিচালিত হয় না: স্ট্যাকের সমস্ত কিছুই "ব্যবহৃত হয়" হিসাবে বিবেচিত হয়। এবং আপনি স্ট্যাকের কল থেকে ফিরে আসার পরে স্ট্যাকের দ্বারা ব্যবহৃত মেমরি স্বয়ংক্রিয়ভাবে পুনরুদ্ধার করা হয়। স্ট্যাক স্পেসের মেমরি পরিচালনা এত সহজ, সস্তা এবং সহজ যে আপনি জঞ্জাল সংগ্রহের সাথে জড়িত থাকতে চান না।

(এমন একটি সিস্টেম রয়েছে যেমন স্মলটাল্ক, যেখানে স্ট্যাক ফ্রেমগুলি হ'ল স্তরের প্রথম স্তরের অবজেক্ট এবং অন্যান্য সমস্ত বস্তুর মতো আবর্জনা সংগ্রহ করা But তবে এটি আজকের জনপ্রিয় পন্থা নয় Java জাভাটির জেভিএম এবং মাইক্রোসফ্টের সিএলআর হার্ডওয়্যার স্ট্যাক এবং সংক্ষিপ্ত স্মৃতি ব্যবহার করে) ।)


7
+1 স্ট্যাকটি সর্বদা সম্পূর্ণরূপে পৌঁছে যায় তাই এটি ছড়িয়ে দেওয়ার কোনও বুদ্ধি নেই
ratchet freak

2
আপনাকে ধন্যবাদ +1, সঠিক উত্তরটি আঘাত করতে 4 টি পোস্ট নিয়েছে। আমি জানি না কেন আপনি স্ট্যাকের সমস্ত কিছু ব্যবহারের জন্য "বিবেচিত" বলেছিলেন, এটি এখনও কমপক্ষে দৃ a় ধারণা হিসাবে ব্যবহার করা হচ্ছে তবুও ব্যবহারযোগ্য heালাগুলি ব্যবহার করা হচ্ছে - তবে এটি একটি বাস্তব নিটপিক খুব ভাল উত্তর।
PSr

@ পিএসএস এর অর্থ হ'ল স্ট্যাকের সমস্ত কিছু দৃ strongly়রূপে পৌঁছতে পারে এবং পদ্ধতিটি না ফিরে আসা পর্যন্ত সংগ্রহ করার দরকার নেই তবে এটি (আরএআইআই) ইতিমধ্যে সুস্পষ্টভাবে পরিচালিত হয়েছে
র‌্যাচেট ফ্রেইক

@ratchetfreak - আমি জানি। এবং আমি কেবল "বিবেচিত" শব্দটির অর্থ সম্ভবত প্রয়োজন নেই, এটি ছাড়া আরও শক্তিশালী বক্তব্য দেওয়া ঠিক আছে।
PSr

5
@ পিএসআর: আমি একমত নই "ব্যবহৃত হিসাবে বিবেচিত " স্ট্যাক এবং গাদা উভয়ের জন্যই খুব গুরুত্বপূর্ণ কারণ খুব গুরুত্বপূর্ণ কারণে। আপনি যা চান তা হ'ল যা আবার ব্যবহার করা হবে না তা বাতিল করা; আপনি যা করেন তা হ'ল আপনি যা পৌঁছনীয় নয় তা বাতিল করে দিন । আপনার কাছে অ্যাক্সেসযোগ্য ডেটা থাকতে পারে যা আপনার কখনও প্রয়োজন হবে না; যখন এই ডেটা বৃদ্ধি পায়, আপনার একটি মেমরি ফাঁস হয় (হ্যাঁ, তারা জিসি'এল ভাষাগুলিতেও সম্ভব, অনেক লোকের ধারণা মত নয়)। এবং একটি যুক্তিযুক্ত হতে পারে যে স্ট্যাকের ফাঁসও ঘটেছিল, সবচেয়ে সাধারণ উদাহরণটি লেজ কল পুনরুদ্ধারকরণের প্রোগ্রামগুলির লেজ কল-বিলোপ ছাড়াই চালানো হয় (যেমন জেভিএম-তে) বিনা বর্ধিত স্ট্যাক ফ্রেম।
ব্লেজারব্ল্যাড

19

আপনার প্রশ্ন ঘুরিয়ে। আসল প্রেরণামূলক প্রশ্নটি কী পরিস্থিতিতে আমরা আবর্জনা সংগ্রহের ব্যয়টি এড়াতে পারি?

ওয়েল, প্রথম বন্ধ, কি হয় আবর্জনা সংগ্রহের খরচ? দুটি প্রধান ব্যয় আছে। প্রথমত, আপনাকে জীবিত কী তা নির্ধারণ করতে হবে ; এর জন্য সম্ভাব্য অনেক কাজ প্রয়োজন। দ্বিতীয়ত, যখন আপনি এমন কিছু মুক্ত করেন যা তখনও বেঁচে থাকা দুটি জিনিসের মধ্যে বরাদ্দ করা হয় তখন আপনাকে তৈরি হওয়া গর্তগুলি সংক্ষিপ্ত করতে হবে। সেই ছিদ্রগুলি অপব্যয়কর। তবে এগুলি সংযোগ করা খুব ব্যয়বহুল।

কীভাবে আমরা এই ব্যয়গুলি এড়াতে পারি?

স্পষ্টতই যদি আপনি কোনও স্টোরেজ ব্যবহারের ধরণটি খুঁজে পান যেখানে আপনি কখনই কোনও দীর্ঘজীবী কিছু বরাদ্দ করেন না , তারপরে স্বল্প-স্থায়ী কিছু বরাদ্দ করেন, তারপরে দীর্ঘস্থায়ী কিছু বরাদ্দ করেন, আপনি গর্তের ব্যয় নির্মূল করতে পারেন। আপনি যদি গ্যারান্টি দিতে পারেন যে আপনার স্টোরেজের কিছু উপসেটের জন্য, প্রতিটি পরবর্তী বরাদ্দ সেই স্টোরেজের আগেরটির তুলনায় স্বল্প-জীবনকালীন হয় তবে সেই স্টোরেজে কোনও গর্ত কখনও হবে না।

তবে আমরা যদি গর্তের সমস্যাটি সমাধান করেছি তবে আমরা আবর্জনা সংগ্রহের সমস্যাটিও সমাধান করেছি । আপনার কাছে সেই স্টোরেজে কিছু আছে যা এখনও বেঁচে আছে? হ্যাঁ। দীর্ঘায়ু হওয়ার আগে কি সবকিছু বরাদ্দ ছিল? হ্যাঁ - এই ধারণাটি হ'ল কীভাবে আমরা গর্তের সম্ভাবনাটি দূর করেছি। সুতরাং আপনাকে যা করতে হবে তা হ'ল "অতি সাম্প্রতিক বরাদ্দটি কি বেঁচে আছে?" এবং আপনি জানেন যে সেই স্টোরেজে সমস্ত কিছু জীবিত।

আমাদের কি স্টোরেজ বরাদ্দের একটি সেট রয়েছে যেখানে আমরা জানি যে পরবর্তী বরাদ্দগুলি পূর্বের বরাদ্দের চেয়ে স্বল্প-স্থায়ী? হ্যাঁ! অ্যাক্টিভেশন ফ্রেমের পদ্ধতিগুলি সর্বদা বিপরীত ক্রমে নষ্ট হয় যা সেগুলি তৈরি করা হয়েছিল কারণ সেগুলি সক্রিয়করণের তুলনায় তারা সর্বদা স্বল্প-জীবিত।

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

এজন্য আমাদের প্রথম স্থানে স্ট্যাকের উপর অস্থায়ী পুল রয়েছে: কারণ এটি কোনও স্মৃতি পরিচালনার জরিমানা ব্যতীত পদ্ধতি অ্যাক্টিভেশন বাস্তবায়নের একটি সহজ উপায়।

(অবশ্যই অ্যাক্টিভেশন ফ্রেমে রেফারেন্স দ্বারা উল্লেখ করা মেমরি সংগ্রহের ব্যয় এখনও রয়েছে))

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

সি # 2.0 এর আকারে এই বৈশিষ্ট্যটি রয়েছে yield return। ফলন প্রত্যাবর্তন করে এমন একটি পদ্ধতি পরবর্তী সময়ে পুনরায় সক্রিয় হতে চলেছে - পরের বার যা মুভনেেক্সট বলা হয় - এবং যখন ঘটে তখন অনুমানযোগ্য নয়। সুতরাং পুনরাবৃত্তকারী ব্লকের অ্যাক্টিভেশন ফ্রেমের জন্য স্ট্যাকের মধ্যে থাকা তথ্যগুলি পরিবর্তে গাদাতে সংরক্ষণ করা হয়, যেখানে গণক সংগ্রহ করা হলে এটি আবর্জনা সংগ্রহ করা হয়।

একইভাবে, সি # এবং ভিবি'র পরবর্তী সংস্করণগুলিতে আসা "অ্যাসিঙ্ক / অপেক্ষার" বৈশিষ্ট্যটি আপনাকে এমন পদ্ধতি তৈরি করতে অনুমতি দেবে যার পদ্ধতির ক্রিয়া চলাকালীন সুনির্দিষ্ট পয়েন্টগুলিতে সক্রিয়করণগুলি "ফলন" এবং "পুনঃসূচনা" করবে " যেহেতু অ্যাক্টিভেশন ফ্রেমগুলি এখন পূর্বাভাসযোগ্য পদ্ধতিতে তৈরি করা এবং ধ্বংস করা হয় না, তাই স্ট্যাকের মধ্যে যে সমস্ত তথ্য সঞ্চিত ছিল তা সমস্ত স্তূপে সংরক্ষণ করতে হবে।

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


13

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

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


5
তবে গাদাটি "উদাহরণস্বরূপ ডেটা" এর অবস্থান নয়। তারা স্ট্যাকের উপরও থাকতে পারে।
সুইভ

@ এসভিক অবশ্যই ভাষার উপর নির্ভরশীল। জাভা কেবল হ্যাপ-বরাদ্দকৃত অবজেক্টগুলিকে সমর্থন করে এবং ভালা হ্যাপ-বরাদ্দ (শ্রেণি) এবং স্ট্যাক-বরাদ্দকৃত (স্ট্রাক্ট) মধ্যে বেশ স্পষ্টভাবে পার্থক্য করে।
ফুলফুল

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

@MatthieuM। এটা আমার বক্তব্য সাজানোর ছিল।
সাফ

@ ফ্লুফি: সুতরাং স্তরে স্ট্রাক্ট বরাদ্দকালে কেন স্তূপে ক্লাস বরাদ্দ করা হয়?
অন্ধকার টেম্পলার

10

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


1
এটি কেবল 'অবশেষে' বিলোপ করা হবে না তবে এটি সঠিক সময়ে deallocated হবে।
বোরিস ইয়াঙ্কভ

3
  1. এগুলির আকার অনুমানযোগ্য (স্ট্যাক ব্যতীত ধ্রুবক, এবং স্ট্যাকটি সাধারণত কয়েকটি এমবিতে সীমাবদ্ধ থাকে) এবং সাধারণত খুব ছোট (কমপক্ষে শত শত এমবি এর তুলনায় বড় অ্যাপ্লিকেশন বরাদ্দ থাকতে পারে)।

  2. গতিশীলভাবে বরাদ্দ করা বস্তুগুলির সাধারণত একটি ছোট সময়সীমা থাকে যাতে তারা পৌঁছতে পারে। এর পরে, তাদের আর কখনও উল্লেখ করা যায় না। ডেটা বিভাগ, গ্লোবাল ভেরিয়েবল এবং এ জাতীয় এন্ট্রিগুলির সাথে এর বিপরীতে: ঘন ঘন, কোডের একটি অংশ রয়েছে যা তাদের সরাসরি (চিন্তাভাবনা const char *foo() { return "foo"; }) উল্লেখ করে । সাধারণত, কোড পরিবর্তন হয় না, সুতরাং রেফারেন্সটি থাকার জন্য সেখানে রয়েছে এবং প্রতিটি সময় ফাংশনটি চালিত হওয়ার সাথে সাথে অন্য রেফারেন্স তৈরি করা হবে (যা কম্পিউটার যে কোনও সময় জানতে পারে - আপনি যদি থামার সমস্যাটি সমাধান না করেন, তা হ'ল) )। সুতরাং আপনি যেভাবেই মেমরিটি বেশিরভাগ ক্ষেত্রেই মুক্ত করতে পারেননি , কারণ এটি সর্বদা পৌঁছনীয়।

  3. অনেক আবর্জনা-সংগৃহীত ভাষায়, সবকিছু প্রোগ্রাম দৌড়ে হচ্ছে অন্তর্গত হিপ-নির্দিষ্ট হয়। পাইথনে, কেবল কোনও ডেটা বিভাগ এবং স্ট্যাক-বরাদ্দকৃত মান নেই (স্থানীয় ভেরিয়েবলগুলি উল্লেখ রয়েছে এবং এখানে কল স্ট্যাক রয়েছে, তবে intসি-তে একই অর্থে কোনও মান নেই )। প্রতিটি বস্তু গাদা আছে।


"পাইথনে, কেবল কোনও ডেটা বিভাগ নেই"। এটি কঠোরভাবে সত্য বলছে না। আমি যেমন বুঝতে পেরেছি তেমন কোনও, সত্য এবং মিথ্যা বরাদ্দ করা হয়নি: স্ট্যাকওভারফ্লো
জেসন বেকার

@ জেসনবেকার: আকর্ষণীয় সন্ধান! যদিও এর কোনও প্রভাব নেই। এটি একটি বাস্তবায়ন বিশদ এবং অন্তর্নির্মিত বস্তুর মধ্যে সীমাবদ্ধ। যে যারা বস্তুর প্রত্যাশিত নেই deallocated করা উল্লেখ না কি যাহাই হউক না কেন প্রোগ্রাম জীবদ্দশায় নয়, এবং আকার ছোট হয় (কম 32 প্রতিটি বাইট, আমি অনুমান চাই)।

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

2

অন্যান্য বেশ কয়েকটি প্রতিক্রিয়াশীল যেমন বলেছেন, স্ট্যাকটি মূল সংস্থার একটি অংশ, সুতরাং এটি রেফারেন্সের জন্য স্ক্যান করা হয় তবে "প্রতি সংগ্রহ" হয় না।

আমি কেবল কয়েকটি মন্তব্যে প্রতিক্রিয়া জানাতে চাই যা বোঝায় যে স্ট্যাকের আবর্জনা কোনও বিষয় নয়; এটি করে, কারণ এটি গাদাতে আরও আবর্জনা গ্রহণযোগ্য বলে বিবেচিত হতে পারে। বিবেকবান ভিএম এবং সংকলক লেখকরা ফাঁকা বা অন্যথায় স্ট্যাকের মৃত অংশগুলি স্ক্যানিং থেকে বাদ দেন। আইআইআরসি, কিছু ভিএমগুলিতে পিসি রেঞ্জের টেবিল ম্যাপিং রয়েছে স্যাক-স্লট-লাইভনেস বিটম্যাপ এবং অন্যেরা স্লটগুলি বাতিল করে দেয়। কোন কৌশলটি বর্তমানে পছন্দ করা হয়েছে তা আমি জানি না।

এই বিশেষ বিবেচনার বর্ণনা দেওয়ার জন্য ব্যবহৃত একটি শব্দ স্থানের জন্য নিরাপদ


জানতে আকর্ষণীয় হতে হবে। প্রথম ধারণাটি হ'ল শূন্যস্থানগুলি বাতিল করা সর্বাধিক বাস্তবসম্মত। বাদ দেওয়া জায়গাগুলির গাছের সন্ধানে কেবল নালার মাধ্যমে স্ক্যান করার চেয়ে বেশি সময় লাগতে পারে। স্পষ্টতই স্ট্যাকটি কমপ্যাক্ট করার কোনও প্রচেষ্টা বিপদ পূর্ণ! সেই কাজটি করা মন-বাঁকানো / ত্রুটি-প্রবণ প্রক্রিয়ার মতো শোনাচ্ছে।
ব্রায়ান নোব্লাচ

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

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

1

আপনার এবং অন্যান্য অনেকের ভুল হয়ে গেছে এমন কয়েকটি মৌলিক ভুল ধারণাটি তুলে ধরতে দাও:

"কেন আবর্জনা সংগ্রহ কেবল গাদা জোর করে?" এটি অন্য রাস্তা। কেবলমাত্র সরলতম, সবচেয়ে রক্ষণশীল এবং ধীরতম আবর্জনা সংগ্রহকারীরা গাদা জোর করে। এ কারণেই তারা এত ধীর।

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

যেহেতু স্তূপটি স্ট্যাকের (গুলি) থেকে প্রায় 1000x বড়, এই জাতীয় স্ট্যাক-স্ক্যানিং জিসি সাধারণত খুব দ্রুত। S 15ms বনাম 250 মিমি আকারের সাধারণ আকারের on যেহেতু এটি বস্তুগুলি এক স্থান থেকে অন্য স্থানে অনুলিপি করছে (চালনা করছে), এটিকে বেশিরভাগ ক্ষেত্রে একটি আধা-স্থান অনুলিপি সংগ্রাহক বলা হয়, তাই এটি 2x মেমরির প্রয়োজন এবং তাই খুব ছোট ডিভাইসে বেশিরভাগ ব্যবহারযোগ্য নয় এমন ফোন খুব বেশি মেমরির পছন্দ করে না। এটি কমপ্যাক্ট করছে, সুতরাং এটি খুব সহজ ক্যাশে বন্ধুত্বপূর্ণ, পরে সহজ চিহ্ন এবং সুইপ হ্যাপ স্ক্যানারগুলির বিপরীতে।

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

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


প্রশ্নটি নির্দিষ্ট আবর্জনা সংগ্রহের অ্যালগরিদমের চেয়ে মেমরির কোন অংশগুলি আবর্জনা সংগ্রহ করা হয় সে সম্পর্কে আরও মনে হয় be শেষ বাক্যটি বিশেষত বোঝায় যে ওপি আবর্জনা সংগ্রহ বাস্তবায়নের জন্য একটি নির্দিষ্ট প্রক্রিয়া না করে "জঞ্জাল সংগ্রহ" এর জেনেরিক প্রতিশব্দ হিসাবে "সুইপ" ব্যবহার করছে। এটি বিবেচনা করে, আপনার উত্তরটি এসে পৌঁছেছে যে কেবল সাধারণ আবর্জনা সংগ্রহকারী আবর্জনা গাদা সংগ্রহ করে এবং দ্রুত আবর্জনা সংগ্রহকারীরা ময়লা এবং স্থির মেমরি সংগ্রহ করে, গাদাটি স্মৃতিশক্তি শেষ না হওয়া অবধি বাড়তে থাকে এবং বাড়তে থাকে।
বিট্রি

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

0

স্ট্যাকের বরাদ্দ কী? স্থানীয় ভেরিয়েবল এবং রিটার্ন ঠিকানা (সি তে)। যখন কোনও ফাংশন ফিরে আসে, এর স্থানীয় ভেরিয়েবলগুলি ফেলে দেওয়া হয়। স্ট্যাক ঝাড়ানো এটি প্রয়োজনীয় নয়, এমনকি ক্ষতিকারকও নয়।

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

একটি আকর্ষণীয় ব্যতিক্রম রয়েছে: চিকেন স্কিমের আবর্জনা সংগ্রাহক স্ট্যাকটি ঝাঁপিয়ে পড়ে (এক উপায়ে), কারণ এর বাস্তবায়ন স্ট্যাকটিকে আবর্জনা সংগ্রহের প্রথম প্রজন্মের স্থান হিসাবে ব্যবহার করে: দেখুন চিকেন স্কিম ডিজাইন উইকিপিডিয়া

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.