কীভাবে কোনও আবর্জনা সংগ্রহকারী প্রতিটি সংগ্রহে পুরো মেমরিটি স্ক্যান করা থেকে রক্ষা করে?


16

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

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

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

আমি কি কিছু মিস করছি বা আবর্জনা সংগ্রহকারী আসলে প্রতিবার এবং প্রতিটি রেফারেন্সটি প্রতিবার সংগ্রহ করার সময় স্ক্যান করছে?


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

উত্তর:


14

মৌলিক পর্যবেক্ষণগুলি যা প্রজন্মের আবর্জনা-সংগ্রহগুলি সমস্ত পুরানো-প্রজন্মের অবজেক্টগুলিকে স্ক্যান না করে এড়াতে দেয়:

  1. সংগ্রহের পরে, এখনও বিদ্যমান সমস্ত বস্তুগুলি কিছুটা ন্যূনতম প্রজন্মের হবে (যেমন। নেট, একটি জেন ​​0 সংগ্রহের পরে, সমস্ত বস্তু জেন 1 বা জেন 2; জেন 1 বা জেন 2 সংগ্রহের পরে, সমস্ত বস্তু জেন 2)।
  2. কোনও বস্তু, বা এর অংশ, যা সংগ্রহ বা লিখিত হয়নি যা প্রজন্ম এন বা তার চেয়ে বেশি প্রজন্মের সমস্ত কিছুকে উত্সাহিত করে, নিম্ন প্রজন্মের বস্তুর কোনও উল্লেখ থাকতে পারে না।
  3. যদি কোনও বস্তু একটি নির্দিষ্ট প্রজন্মের কাছে পৌঁছেছে, তবে নিম্ন প্রজন্মকে সংগ্রহ করার সময় এটির ধরে রাখা নিশ্চিত করার জন্য এটি পৌঁছনীয় হিসাবে চিহ্নিত হওয়ার দরকার নেই।

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

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


যেকোন সিস্টেমে চলা মেমরি ব্লকগুলির চারপাশে ব্যয়বহুল, সুতরাং আপনার কোয়াড গিগজ সিপিইউ সিস্টেমে সুইপটি উন্নত করা একটি লাভ।
gbjbaanb

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

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

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

7

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

"তবে এটি ভুল", আমি আপনাকে চিৎকার করতে শুনি, "পুরানো অবজেক্টগুলি যুবক বস্তুগুলিকে বোঝাতে পারে এবং করতে পারে"। আপনি ঠিক বলেছেন, এবং এর বেশ কয়েকটি সমাধান রয়েছে, যা সমস্ত জ্ঞান অর্জনের চারপাশে ঘুরে বেড়ায়, দ্রুত এবং দক্ষতার সাথে, কোন পুরানো বিষয়গুলি অবশ্যই পরীক্ষা করা উচিত এবং কোনটি উপেক্ষা করা নিরাপদ। এগুলি রেকর্ডিং অবজেক্টগুলিতে, বা ছোট (সামগ্রীর চেয়ে বড়, তবে পুরো গাদা থেকে অনেক ছোট) মেশিনির রেঞ্জগুলিতে অল্প বয়স্ক প্রজন্মের কাছে পয়েন্টার যুক্ত রয়েছে pretty অন্যরা এগুলি আমার চেয়ে অনেক বেশি ভাল বর্ণনা করেছেন, সুতরাং আমি আপনাকে কয়েকটি কীওয়ার্ড দেব: কার্ড চিহ্নিতকরণ, সেটগুলি স্মরণে রেখে, বাধা লিখতে। অন্যান্য কৌশলও রয়েছে (সংকরগুলি সহ) তবে এগুলি যে সাধারণ পদ্ধতির সাথে আমি অবগত enc


3

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


1

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

মূল বক্তব্যটি হ'ল আবর্জনা সংগ্রহকারীগণ কম্পাইলারের সাথে এবং বাকি রানটাইমের সাথে ঘনিষ্ঠভাবে কাজ করে এই মায়াজালটি দেখছে যে মায়া রাখে তা বজায় রাখতে।


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

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

-2

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

সুতরাং, তৃতীয় প্রজন্মের জিনিসগুলি সাধারণত এমন কোনও জিনিস যা কোনও কারণে খোলা থাকে এবং জিসি খুব ঘন ঘন সেখানে চেক করে না।


1
তবে কীভাবে এটি জানবে যে কোন জিনিসগুলি ব্যবহৃত হচ্ছে?
পিটার ভ্যান জিনকেল

এটি অ্যাক্সেসযোগ্য কোড থেকে কোন বিষয়গুলি অ্যাক্সেসযোগ্য can এক্সিকিউট করা যায় এমন কোনও কোড থেকে কোনও বস্তুর কাছে আর অ্যাক্সেসযোগ্য না হলে (বলুন যে পদ্ধতিটি ফিরে এসেছে তার কোড) তবে জিসি জানেন যে এটি সংগ্রহ করা নিরাপদ
এলএল

আপনি উভয়ই জিসি কীভাবে সঠিক তা বর্ণনা করছেন, তারা কীভাবে দক্ষ are প্রশ্ন থেকে বিচার, ওপি সম্পূর্ণরূপে ভাল জানেন।

@ ডেলান হ্যাঁ আমি এই প্রশ্নের উত্তর দিচ্ছিলাম যে এটি কীভাবে জানে যে কোন জিনিসগুলি ব্যবহৃত হচ্ছে, যা পাইটারের মন্তব্যে ছিল।
এল

-5

সাধারণত এই জিসি দ্বারা ব্যবহৃত অ্যালগরিদম হ'ল ন্যাভ মার্ক এবং অ্যান্ড সুইপ

আপনার এই সত্যটি সম্পর্কে সচেতন হওয়া উচিত যে এটি নিজে সি # দ্বারা পরিচালিত নয়, তথাকথিত সিএলআর দ্বারা পরিচালিত ।


মনোর আবর্জনা সংগ্রাহক সম্পর্কে পড়ার মাধ্যমে আমি এই অনুভূতিটি পেয়েছি। যাইহোক, আমি যা বুঝতে পারি না তা কেন তারা যদি কখনও সংগ্রহের সম্পূর্ণ কার্য সেটটি স্ক্যান করছে তবে তাদের একটি প্রজন্মের সংগ্রাহক রয়েছে যার সাথে তার GEN-0 সংগ্রহ খুব দ্রুত। 2 জিবি বলার একটি কার্যনির্বাহী দিয়ে এটি কীভাবে দ্রুত হতে পারে?
পিটার ভ্যান জিনকেল

ঠিক আছে, মনোর আসল জিসি হ'ল সেগেন, আপনার এই মনো-প্রজেক্ট / জেনারেশনাল_জিসি বা কিছু অনলাইন নিবন্ধগুলি পড়তে হবে schani.wordpress.com/tag/mono infoQ.com/news/2011/01/S জেন , কথাটি হ'ল সিএলআর এবং সিএলআই-এর মতো এই নতুন প্রযুক্তিগুলির একটি সত্যিকারের মডুলার ডিজাইন রয়েছে, ভাষাটি সিএলআরের জন্য কিছু প্রকাশ করার উপায় হয়ে যায় এবং বাইনারি কোড তৈরির উপায় নয়। আপনার প্রশ্ন বাস্তবায়নের বিশদ সম্পর্কিত এবং অ্যালগরিদম সম্পর্কে নয়, কারণ একটি অ্যালগরিদমের এখনও বাস্তবায়ন নেই, আপনার কেবল মনোর কাছ থেকে প্রযুক্তিগত কাগজপত্র এবং নিবন্ধগুলি পড়া উচিত, অন্য কেউ নয়।
ব্যবহারকারী 827992

আমি বিভ্রান্ত কোনও আবর্জনা সংগ্রহকারী যে কৌশলটি ব্যবহার করেন তা কোনও অ্যালগরিদম নয়?
পিটার ভ্যান জিনকেল

2
-1 বিভ্রান্তিকর ওপি বন্ধ করুন। জিসি সিএলআরের অংশ এবং ভাষা-নির্দিষ্ট নয় এটি মোটেই প্রাসঙ্গিক নয়। একটি জিসি বেশিরভাগ ক্ষেত্রে এটি স্তূপ থেকে বেরিয়ে আসে এবং পুনরায় ব্যবহারযোগ্যতা নির্ধারণ করে এবং এর পরে ব্যবহৃত সমস্ত অ্যালগরিদম (গুলি) এর জন্য ব্যবহৃত হয় by যদিও অ্যালগরিদমের অনেকগুলি বাস্তবায়ন হতে পারে এবং আপনি প্রয়োগের বিবরণে জড়িয়ে পড়বেন না, তবে অ্যালগোরিদম একাই নির্ধারণ করে যে কতগুলি বস্তু স্ক্যান করা হয়েছে। একটি প্রজন্মের জিসি হ'ল একটি অ্যালগরিদম + হ্যাপ লেআউট যা "প্রজন্মের হাইপোথিসিস" ব্যবহার করার চেষ্টা করে (বেশিরভাগ বস্তু যুবক মারা যায়)। এগুলি নিষ্পাপ নয়।

4
অ্যালগোরিদম! = বাস্তবায়ন আসলেই, তবে এটি একটি ভিন্ন অ্যালগরিদমের বাস্তবায়ন হওয়ার আগেই বাস্তবায়ন কেবল এটিকে বিচ্যুত করতে পারে। জিসি বিশ্বে একটি অ্যালগরিদম বিবরণ অত্যন্ত সুনির্দিষ্ট এবং নার্সারি সংগ্রহের পুরো হিপ স্ক্যান না করা এবং আন্তঃজেনারাল পয়েন্টার কীভাবে পাওয়া যায় এবং সংরক্ষণ করা হয় সেগুলি অন্তর্ভুক্ত রয়েছে। এটি সত্য যে একটি অ্যালগরিদম আপনাকে অ্যালগরিদমের নির্দিষ্ট পদক্ষেপ নিতে কতক্ষণ সময় দেয় তা বলে না তবে এটি এই প্রশ্নের সাথে মোটেই প্রাসঙ্গিক নয়।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.