আপনি সমস্ত জিসি বাস্তবায়ন ব্যবহারের উপযুক্ত উপায় সম্পর্কে কম্বল স্টেটমেন্ট দিতে পারবেন না । তারা বন্যভাবে পরিবর্তিত হয়। সুতরাং আমি .NET এর সাথে কথা বলব যা আপনি মূলত উল্লেখ করেছেন।
কোনও যুক্তি বা যুক্তি সহ এটি করার জন্য আপনার অবশ্যই জিসির আচরণ বেশ ঘনিষ্ঠভাবে জানতে হবে।
সংগ্রহের বিষয়ে আমি কেবলমাত্র পরামর্শ দিতে পারি: এটি কখনই করবেন না।
আপনি যদি সত্যিই জিসির জটিল জটিল বিবরণ জানেন তবে আপনার আমার পরামর্শের দরকার পড়বে না তাই এটি বিবেচ্য নয়। যদি আপনি ইতিমধ্যে 100% আত্মবিশ্বাসের সাথে না জানেন তবে এটি সাহায্য করবে, এবং অনলাইনে সন্ধান করতে হবে এবং এর মতো উত্তর খুঁজে পেতে হবে: আপনাকে জিসি.কলেক্ট বা কল হিসাবে কল করা উচিত নয় : জিসি কীভাবে কাজ করে তার বিশদ শিখতে হবে আপনার ভিতরে এবং বাইরে, এবং কেবল তখনই আপনি উত্তরটি জানবেন ।
এখানে একটি নিরাপদ জায়গা রয়েছে যা এটি জিসি ব্যবহারের জন্য কিছুটা অর্থপূর্ণ করে তোলে sense সংগ্রহ :
জিসি.কালেক্ট একটি এমন এপিআই উপলব্ধ যা আপনি বিভিন্ন সময় প্রোফাইলের জন্য ব্যবহার করতে পারেন। আপনি এক অ্যালগরিদমকে প্রোফাইল তৈরি করতে, সংগ্রহ করতে এবং তত্ক্ষণাত্র পরে অন্য অ্যালগরিদমকে প্রোফাইল তৈরি করতে পারেন তারপরে প্রথম অ্যালগোয়ের জিসি আপনার দ্বিতীয়টি ফলাফলের সিকোয়িংয়ের সময় ঘটেছিল না তা জেনে।
এই ধরণের প্রোফাইলিংটি একক সময় হ'ল আমি কখনই কারও কাছে ম্যানুয়ালি সংগ্রহের পরামর্শ দিই।
যেভাবেই হোক উদাহরণস্বরূপ
ব্যবহারের একটি সম্ভাব্য কেস হ'ল আপনি যদি সত্যিই বড় জিনিস লোড করেন তবে সেগুলি বড় অবজেক্ট হিপ-এ শেষ হবে যা সরাসরি জেন 2 এ চলে যাবে, যদিও আবার জেন 2 লম্বা বেঁচে থাকা বস্তুর জন্য কারণ এটি কম ঘন ঘন সংগ্রহ করে। আপনি যদি জানেন যে যে কোনও কারণে আপনি জেনার 2 এ স্বল্পজীবী জিনিসগুলি লোড করছেন, আপনি আপনার জেনার 2 কে আরও ছোট রাখতে আরও দ্রুত তা সাফ করতে পারেন এবং এটির সংগ্রহগুলি আরও দ্রুত।
এটি সর্বোত্তম উদাহরণ যা আমি সামনে আসতে পেরেছিলাম, এবং এটি ভাল নয় - আপনি যে এলওএইচ চাপ তৈরি করছেন তা ঘন ঘন সংগ্রহের কারণ হতে পারে, এবং সংগ্রহগুলি যেমন হয় ততই ঘন ঘন হয়ে যায় - সম্ভবত এলওএইচটিকে পরিষ্কার করার সম্ভাবনা রয়েছে chan অস্থায়ী বস্তুগুলির সাথে আপনি যখন এটি ফুটিয়েছিলেন তখনই দ্রুত। আমি নিজে থেকে খুব বেশি সংগ্রহের ফ্রিকোয়েন্সি ধরে নিতে পারি না জিসি থেকে - এটি আমার চেয়ে অনেক বেশি স্মার্ট লোকদের দ্বারা সুরযুক্ত
সুতরাং আসুন। নেট জিসি ... বা .. এর কয়েকটি শব্দার্থক এবং পদ্ধতি সম্পর্কে কথা বলি ..
আমি নেট নেট জিসি সম্পর্কে আমার যা কিছু মনে হয় তা আমি জানি
দয়া করে, এখানে যে কেউ ত্রুটি খুঁজে পান - আমাকে সংশোধন করুন। জিসির বেশিরভাগ অংশই কালো যাদু হিসাবে পরিচিত এবং আমি বিবরণ দেওয়ার চেষ্টা করার সময় আমি অনিশ্চিত ছিলাম, সম্ভবত আমি এখনও কিছু জিনিস ভুল পেয়েছি।
নীচে উদ্দেশ্যমূলকভাবে এমন অসংখ্য বিবরণ অনুপস্থিত যা আমি সম্পর্কে নিশ্চিত নই, সেই সাথে তথ্যগুলির একটি বৃহত্তর অংশ যা আমি কেবল অজানা। আপনার নিজের ঝুঁকিতে এই তথ্য ব্যবহার করুন।
জিসি ধারণা
.NET জিসি অসামঞ্জস্য সময়ে ঘটে থাকে, এ কারণেই এটিকে "অ-নিরস্তুত্ববাদী" বলা হয়, এর অর্থ আপনি নির্দিষ্ট সময়ে ঘটতে এর উপর নির্ভর করতে পারবেন না। এটি একটি প্রজন্মের আবর্জনা সংগ্রহকারীও, যার অর্থ এটি আপনার বস্তুকে ভাগ করে নিচ্ছে যে তারা কতটা জিসি পাস করেছে।
জেনারেল 0 হিপে অবজেক্টগুলি 0 সংগ্রহের মধ্য দিয়ে বেঁচে থাকে, এগুলি নতুনভাবে তৈরি করা হয়েছে তাই সম্প্রতি তাদের ইনস্ট্যান্টেশন হওয়ার পরে কোনও সংগ্রহ ঘটেনি। আপনার জেনারেল 1 হিপের অবজেক্টগুলি একটি সংগ্রহ পাসের মধ্য দিয়ে বেঁচে আছে এবং একইভাবে আপনার জেনার 2 হ্যাপের অবজেক্টগুলি 2 সংগ্রহ পাসের মধ্য দিয়ে বেঁচে থাকে।
এখন সে কারণেই এটি নির্দিষ্ট প্রজন্ম এবং পার্টিশনগুলির যোগ্যতা অর্জন করার কারণটি লক্ষ্য করার মতো। .NET জিসি কেবল এই তিনটি প্রজন্মকেই স্বীকৃতি দেয়, কারণ এই তিনটি স্তূপের ওপরে যে সংগ্রহটি পাস হয় সেগুলি কিছুটা আলাদা। কিছু বস্তু সংগ্রহ থেকে বেঁচে থাকতে পারে হাজার হাজার বার। জিসি এগুলি কেবল জেন 2 হ্যাপ পার্টিশনের অন্যদিকে রেখে দেয়, এগুলি আর কোথাও ভাগ করার কোনও অর্থ নেই কারণ তারা আসলে জেনারেল 44; তাদের উপরের সংগ্রহ পাসটি জেন 2 হ্যাপের সমস্ত কিছুর সমান।
এই নির্দিষ্ট প্রজন্মের অর্থগত উদ্দেশ্য রয়েছে, পাশাপাশি বাস্তবায়িত প্রক্রিয়া রয়েছে যা এগুলি সম্মান করে এবং আমি এক মুহুর্তের মধ্যে তাদের কাছে পৌঁছে দেব।
একটি সংগ্রহে কি
একটি জিসি সংগ্রহ পাসের প্রাথমিক ধারণাটি হ'ল এটি একটি গাদা স্থানের প্রতিটি বস্তু পরীক্ষা করে দেখে নিন যে এই পদার্থগুলির জন্য এখনও লাইভ রেফারেন্স (জিসি রুট) রয়েছে কিনা। যদি কোনও জিনিসের জন্য একটি জিসি রুট পাওয়া যায়, তবে এর অর্থ বর্তমানে কার্যকরকরণ কোডটি এখনও সেই অবজেক্টে পৌঁছতে এবং ব্যবহার করতে পারে, সুতরাং এটি মোছা যাবে না। তবে যদি কোনও জিনিসের জন্য একটি জিসি রুট না পাওয়া যায় তবে এর অর্থ চলমান প্রক্রিয়াটির আর অবজেক্টের প্রয়োজন হয় না, তাই এটি নতুন অবজেক্টের জন্য মেমরি মুক্ত করতে এটিকে সরাতে পারে।
এখন এটি একগুচ্ছ বস্তু পরিষ্কার করা এবং কিছু একা রেখে দেওয়ার পরে, একটি দুর্ভাগ্যজনক পার্শ্ব প্রতিক্রিয়া দেখা দিতে পারে: মৃত ব্যক্তিদের অপসারণ করা হয়েছে এমন লাইভ অবজেক্টগুলির মধ্যে ফাঁকা জায়গার ব্যবধান। এই মেমরি বিভাজন যদি একা ছেড়ে যায় কেবল মেমোরি নষ্ট করে দেয়, সুতরাং সংগ্রহগুলি সাধারণত "কমপ্যাকশন" বলে তা করবে যেখানে তারা সমস্ত লাইভ অবজেক্টকে বামে নিয়ে যায় এবং এগুলি একসাথে গিলে ফেলবে যাতে জেনারেলের জন্য মুক্ত মেমরিটি স্তূপের একপাশে সামঞ্জস্যপূর্ণ হয় 0।
এখন 3 টি মেমরির ধারণার ধারণা দেওয়া, তারা যে সমস্ত সংগ্রহের মধ্য দিয়ে জীবনযাপন করেছে তার সংখ্যা দ্বারা বিভক্ত, এই পার্টিশনগুলি কেন বিদ্যমান তা নিয়ে আলোচনা করা যাক।
জেনারেল 0 সংগ্রহ
জেনারেল 0 সম্পূর্ণ নতুন অবজেক্টস হওয়ায় খুব ছোট হতে থাকে - যাতে আপনি এটি খুব ঘন ঘন নিরাপদে সংগ্রহ করতে পারেন । ফ্রিকোয়েন্সি নিশ্চিত করে যে গাদাটি ছোট থাকে এবং সংগ্রহগুলি খুব দ্রুত হয় কারণ তারা এ জাতীয় একটি ছোট ছোট গাদা সংগ্রহ করছে। এই বেশী বা একটি অনুসন্ধানমূলক প্রক্রিয়া দাবী করেন যে কম ভিত্তি করে: একটি বড় অংশ অস্থায়ী বস্তু যা আপনি তৈরি, হয় খুব অস্থায়ী, তাই অস্থায়ী তারা আর ব্যবহার করব করা বা ব্যবহারের পরে প্রায় সঙ্গে সঙ্গেই রেফারেন্সড, এবং এইভাবে সংগ্রহ করা যাবে।
জেনার 1 সংগ্রহ
জেনারেল 1 হ'ল বস্তু যা এই খুব অস্থায়ী বিভাগের অবজেক্টগুলির মধ্যে পড়ে না , এটি এখনও স্বল্পস্থায়ী হতে পারে, কারণ স্থির- অবজেক্টগুলির একটি বিশাল অংশ বেশি দিন ব্যবহার করা হয় না। সুতরাং জেনার 1 বরং প্রায়শই প্রায়শই সংগ্রহ করে, আবার এটি খুব কম রাখে যাতে এটির সংগ্রহগুলি দ্রুত হয়। তবে ধারণাটি এর কম বস্তুগুলি জেনারেল 0 এর চেয়ে অস্থায়ী, তাই এটি জেনার 0 এর চেয়ে কম ঘন ঘন সংগ্রহ করে
আমি বলব যে আমি জেনারেল 0 এর সংগ্রহ পাস এবং জেনার 1 এর মধ্যে পার্থক্যযুক্ত প্রযুক্তিগত পদ্ধতিগুলি জানি না, যদি তারা সংগ্রহের ফ্রিকোয়েন্সি ব্যতীত অন্য কোনও কিছু থাকে।
জেনার 2 সংগ্রহ
জেনার 2 এখন অবশ্যই সমস্ত স্তূপের মা হতে হবে? ঠিক আছে, হ্যাঁ, এটি কম-বেশি সঠিক। এটি যেখানে আপনার স্থায়ী অবজেক্টগুলি বাস করে - Main()
উদাহরণস্বরূপ বস্তুটি আপনার জীবন যাপন করে এবং যা Main()
উল্লেখ করা হয় সেগুলি কারণ Main()
আপনার প্রক্রিয়া শেষে আপনার প্রত্যাবর্তন না হওয়া পর্যন্ত সেগুলি মূলযুক্ত হবে ।
প্রদত্ত যে জেনার 2 মূলত অন্যান্য প্রজন্ম সংগ্রহ করতে পারে না এমন সমস্ত কিছুর জন্য একটি বালতি, এটি বস্তুগুলি বেশিরভাগ স্থায়ী হয় বা কমপক্ষে দীর্ঘকাল বেঁচে থাকে। সুতরাং জেনার 2 এ যা আছে তার খুব অল্প পরিমাণে চিনতে আসলে এমন কিছু হবে যা সংগ্রহ করা যেতে পারে, এটি ঘন ঘন সংগ্রহ করার প্রয়োজন হয় না। এটি এত কম ঘন ঘন সঞ্চালিত হওয়ায় এটি এর সংগ্রহটিও ধীর হতে দেয়। সুতরাং এটিই মূলত যেখানে তারা বিজোড় পরিস্থিতিগুলির জন্য সমস্ত অতিরিক্ত আচরণকে সরিয়ে নিয়েছে, কারণ তাদের কার্যকর করার সময় তাদের রয়েছে।
বড় অবজেক্টের গাদা
জেনারেল 2 অতিরিক্ত আচরণে একটি উদাহরণ এটি যে এছাড়াও লার্জ অবজেক্ট গাদা সংগ্রহ করে। এখন অবধি আমি সম্পূর্ণরূপে ছোট ছোট বস্তুর হিপ নিয়ে কথা বলছিলাম, তবে। নেট রানটাইম নির্দিষ্ট আকারের জিনিসগুলিকে আলাদা গাদাতে বরাদ্দ করে কারণ আমি উপরে সংক্ষেপণ হিসাবে উল্লেখ করেছি। সংক্ষিপ্ত অবজেক্ট হিপগুলিতে সংগ্রহ শেষ হওয়ার পরে কমপ্যাকশনটির চারপাশে চলমান অবজেক্টগুলি প্রয়োজন। জেনার 1 এ যদি কোনও 10 মিমি অবজেক্ট থাকে তবে সংগ্রহের পরে কমপ্যাকশনটি সম্পূর্ণ হতে এটি আরও বেশি সময় নিতে পারে, এইভাবে জেনার 1 এর সংগ্রহকে ধীর করে দেয়। যাতে 10 এমবি অবজেক্টটি বড় অবজেক্ট হিপগুলিতে বরাদ্দ করা হয়, এবং জেনার 2 এর সময় সংগ্রহ করা হয় যা খুব কমই চলে।
নিকাশ
চূড়ান্তকরণকারীগুলির সাথে অন্য একটি উদাহরণ। আপনি এমন একটি সামগ্রীতে একটি চূড়ান্তকরণকারী রেখেছেন যা। নেট নেটসিসি (অপরিশোধিত সংস্থানসমূহ) এর পরিধি ছাড়িয়ে সংস্থানগুলিকে উল্লেখ করে। চূড়ান্তকরণকারী হ'ল একমাত্র উপায় নয় যে জিসি একটি অপরিকল্পিত সংস্থান সংগ্রহ করার দাবি জানায় - আপনি আপনার চূড়ান্তকরণটি পরিচালনা প্রক্রিয়াটি পরিচালনা / অপসারণ / অপসারণ পরিচালনা / রিলিজ করার জন্য আপনার প্রক্রিয়া থেকে ফাঁস না হওয়ার বিষয়টি নিশ্চিত করতে বাস্তবায়ন করেন। যখন জিসি আপনার অবজেক্টগুলি চূড়ান্তকরণের জন্য কার্যকর করবে, তখন আপনার বাস্তবায়নটি নিয়ন্ত্রণহীন সংস্থানটি সাফ করে দেবে, জিসি কোনও উত্স ফাঁসের ঝুঁকি ছাড়াই আপনার বিষয়টিকে সরিয়ে ফেলতে সক্ষম করে তুলবে।
চূড়ান্তকরণ ব্যবস্থার মাধ্যমে চূড়ান্তকরণকারীরা যে পদ্ধতিটি এটি করেন তা হ'ল সরাসরি চূড়ান্তকরণের সারিতে রেফারেন্স দেওয়া। যখন রানটাইম কোনও চূড়ান্তকরণকারীর সাথে কোনও বস্তু বরাদ্দ করে, এটি চূড়ান্তকরণের সারিতে সেই বস্তুর একটি পয়েন্টার যুক্ত করে এবং আপনার অবজেক্টটিকে জায়গায় তালাবদ্ধ করে দেয় (পিনিং বলে) সুতরাং কমপ্যাকশন এটি সরিয়ে ফেলবে না যা চূড়ান্তকরণের সারি রেফারেন্সকে ভঙ্গ করবে। সংগ্রহটি পাস হওয়ার সাথে সাথে অবশেষে আপনার অবজেক্টটির আর কোনও সিসি রুট নেই, তবে এটি সংগ্রহের আগে চূড়ান্তকরণ কার্যকর করতে হবে। সুতরাং যখন অবজেক্টটি মারা যায়, সংগ্রহটি এটির রেফারেন্সটি চূড়ান্তকরণের সারি থেকে সরিয়ে নিয়ে যায় এবং "FReachable" সারি হিসাবে পরিচিত সেই বিষয়ে একটি রেফারেন্স রাখবে। তারপরে সংগ্রহ চলতে থাকে। ভবিষ্যতে আর একটি "অ-নিরস্তুত্ববাদী" সময়ে, ফাইনালাইজার থ্রেড হিসাবে পরিচিত একটি পৃথক থ্রেড এফআরেচযোগ্য কাতারে যাবে, প্রতিটি রেফারেন্সের জন্য ফাইনালাইজারকে কার্যকর করবে uting এটি সমাপ্ত হওয়ার পরে, FReachable সারিটি খালি থাকে এবং প্রতিটি বস্তুর শিরোনামে এটি কিছুটা উল্টে যায় যা বলে যে তাদের চূড়ান্তকরণের প্রয়োজন নেই (এই বিটটি নিজে হাতে ফ্লিপ করা যেতে পারে)GC.SuppressFinalize
যা পদ্ধতিতে প্রচলিত Dispose()
), আমার সন্দেহ হয় যে এটি অবজেক্টগুলি আনপিন করেছে, তবে সে সম্পর্কে আমাকে উদ্ধৃতি দেবেন না। পরের সংগ্রহটি যা এই বস্তুটিতে রয়েছে তার উপর যে পরিমাণ apੇਰ রয়েছে তার চারপাশে আসে, শেষ পর্যন্ত এটি সংগ্রহ করবে। জেনারেল 0 সংগ্রহগুলি এমনকি চূড়ান্তকরণ-প্রয়োজনীয় বিট সহ অবজেক্টগুলিতেও মনোযোগ দেয় না, এটি স্বয়ংক্রিয়ভাবে তাদের প্রচার করে, এমনকি তাদের মূলটি পরীক্ষা না করে। জেনার 1 এ চূড়ান্তকরণের প্রয়োজন হওয়া একটি অরক্ষিত বস্তু FReachable
কাতারে নষ্ট হয়ে যাবে , তবে সংগ্রহটি এটির সাথে আর কিছু করে না, সুতরাং এটি জেনারেল 2 এ চলে this এইভাবে, সমস্ত অবজেক্টের একটি ফাইনালাইজার রয়েছে, এবং না GC.SuppressFinalize
জেনারেল 2 এ সংগ্রহ করা হবে।